yu.wu
3 years ago
38 changed files with 16622 additions and 4 deletions
@ -0,0 +1,83 @@ |
|||
/** 派格fis路由 */ |
|||
//import Layout from '@/layout/firstLayout'
|
|||
import Layout from '@/layout' |
|||
|
|||
const pgfis = { |
|||
path: '/pg-fis', |
|||
component: Layout, |
|||
redirect: 'fis', |
|||
name: 'pgfis', |
|||
meta: { |
|||
//requiresAuth: true,
|
|||
title: '派格fis', |
|||
index: 0, |
|||
type: 'crm', |
|||
icon: '业务', |
|||
keepAlive: false, |
|||
}, |
|||
children: [ |
|||
{ |
|||
path: '/customerPartCfg', |
|||
component: () => import('@/views/pg-fis/basedate/customerPartCfg'), |
|||
name: 'customerPartCfg',//命名路由
|
|||
meta: { |
|||
title: '客户零件管理', |
|||
roles: ['SettleAccount.Reports'], |
|||
icon: '发货' |
|||
} |
|||
}, |
|||
{ |
|||
path: '/pg-assemblyCfg', |
|||
component: () => import('@/views/pg-fis/basedate/assemblyCfg'), |
|||
name: 'pg-assemblyCfg',//命名路由
|
|||
meta: { |
|||
title: '总成模块管理', |
|||
roles: ['SettleAccount.Reports'], |
|||
icon: '发货' |
|||
} |
|||
}, |
|||
{ |
|||
path: '/pg-workLine', |
|||
component: () => import('@/views/pg-fis/basedate/workLine'), |
|||
name: 'pg-workLine', |
|||
meta: { |
|||
title: '生产线权限', |
|||
roles: ['SettleAccount.Reports'], |
|||
icon: '供货' |
|||
} |
|||
}, |
|||
{ |
|||
path: '/pg-M100BIll', |
|||
component: () => import('@/views/pg-fis/basedate/m100BIll'), |
|||
name: 'pg-M100BIll',//命名路由
|
|||
meta: { |
|||
title: 'M100单据信息维护', |
|||
roles: ['SettleAccount.Reports'], |
|||
icon: '客户零件' |
|||
} |
|||
}, |
|||
{ |
|||
path: '/pg-M100Online', |
|||
component: () => import('@/views/pg-fis/basedate/m100Online'), |
|||
name: 'pg-M100Online',//命名路由
|
|||
meta: { |
|||
title: 'M100上线信息', |
|||
roles: ['SettleAccount.Reports'], |
|||
icon: '客户零件' |
|||
} |
|||
}, |
|||
{ |
|||
path: '/pg-R100Online', |
|||
component: () => import('@/views/pg-fis/basedate/r100Online'), |
|||
name: 'pg-M100Online',//命名路由
|
|||
meta: { |
|||
title: 'R100上线信息', |
|||
roles: ['SettleAccount.Reports'], |
|||
icon: '客户零件' |
|||
} |
|||
} |
|||
] |
|||
} |
|||
|
|||
export default pgfis |
|||
|
@ -0,0 +1,312 @@ |
|||
<!--FIS发运数据对比输出表-明细数据--> |
|||
<template> |
|||
<div class="cr-body-content"> |
|||
<flexbox class="content-header"> |
|||
<!-- <el-button |
|||
class="filter-item" |
|||
size="mini" |
|||
type="info" |
|||
icon="el-icon-download" |
|||
@click="handleDownload()" |
|||
>导出全部 |
|||
</el-button> |
|||
<el-input |
|||
v-model="searchContent" |
|||
clearable |
|||
size="small" |
|||
placeholder="支持模糊搜索..." |
|||
style="width: 230px" |
|||
class="search-container" |
|||
@keyup.enter.native="handleFilter" |
|||
/> |
|||
<el-button |
|||
size="mini" |
|||
type="success" |
|||
icon="el-icon-search" |
|||
@click="handleFilter" |
|||
>搜索 |
|||
</el-button> --> |
|||
</flexbox> |
|||
<!--表格渲染--> |
|||
<el-table |
|||
ref="multipleTable" |
|||
v-loading="listLoading" |
|||
element-loading-text="拼命加载中..." |
|||
element-loading-spinner="el-icon-loading" |
|||
class="cr-table" |
|||
:data="list" |
|||
:height="tableHeight" |
|||
:cell-style="cellStyle" |
|||
:header-cell-style="headerRowStyle" |
|||
size="small" |
|||
stripe |
|||
border |
|||
highlight-current-row |
|||
style="width: 100%" |
|||
@sort-change="sortChange" |
|||
@selection-change="handleSelectionChange" |
|||
@row-click="handleRowClick" |
|||
> |
|||
<!-- <el-table-column type="selection" width="44px"></el-table-column> --> |
|||
<el-table-column prop="partCode" label="客户零件代码"> </el-table-column> |
|||
<el-table-column prop="description" label="客户零件名称"> </el-table-column> |
|||
<el-table-column prop="partNum" label="客户零件数量"> </el-table-column> |
|||
<el-table-column prop="isKey" label="是否Key件"> |
|||
<template slot-scope="scope"> |
|||
<span v-if="scope.row.isKey == true"> |
|||
<span style="color: #00b46d">是</span> |
|||
</span> |
|||
<span v-else> |
|||
<span style="color: #d75c89">否</span> |
|||
</span> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<div class="table-footer"> |
|||
<!-- 分页控件 style="margin-top: -25px;margin-bottom:-25px;float:right;"--> |
|||
<pagination |
|||
v-show="totalCount > 0" |
|||
:total="totalCount" |
|||
:page.sync="page" |
|||
:limit.sync="listQuery.MaxResultCount" |
|||
@pagination="getList" |
|||
/> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination |
|||
import permission from "@/directive/permission/index.js"; |
|||
import CRMTableHead from "../../components/CRMTableHead"; |
|||
import { downloadFile } from "@/utils/crmindex.js"; |
|||
import Detail from "./detail"; |
|||
|
|||
export default { |
|||
name: "sendUnsettledDiffReport", |
|||
components: { Pagination, CRMTableHead, Detail }, |
|||
directives: { permission }, |
|||
filters: { |
|||
IsCustomerSignFilter(status) { |
|||
//翻译是否签字 |
|||
const statusMap = { |
|||
true: "是", |
|||
false: "否", |
|||
}; |
|||
return statusMap[status]; |
|||
}, |
|||
}, |
|||
props: { |
|||
customerInfos: { |
|||
type: Array, |
|||
default: () => { |
|||
return []; |
|||
}, |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
crmType: "stockFisDiffReport", |
|||
rules: { |
|||
//前端定义的规则,后端也有验证 |
|||
erpMaterialCode: [ |
|||
{ required: true, message: "必须输入!", trigger: "blur" }, |
|||
], |
|||
}, |
|||
searchContent: "", // 输入内容 |
|||
customerInfo: { |
|||
parentId: "", |
|||
}, |
|||
form: { |
|||
dicDetailID: "", |
|||
customerId: "", |
|||
projectId: "", |
|||
}, |
|||
list: null, |
|||
totalCount: 0, |
|||
listLoading: true, |
|||
formLoading: false, |
|||
// 高级搜索 |
|||
filterObj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {}; |
|||
}, |
|||
}, |
|||
listQuery: { |
|||
Filters: [ |
|||
{ |
|||
logic: 0, |
|||
column: "Enabled", |
|||
action: 0, |
|||
value: "true", |
|||
}, //默认查询可用的 |
|||
], |
|||
//OrgID:"", |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
assemblyProductID: "", |
|||
}, |
|||
page: 1, |
|||
dialogFormVisible: false, |
|||
multipleSelection: [], |
|||
formTitle: "", |
|||
drawer: false, |
|||
showExcelImport: false, |
|||
tableHeight: document.documentElement.clientHeight - 260, |
|||
isEdit: false, |
|||
}; |
|||
}, |
|||
mounted() { |
|||
var self = this; |
|||
window.onresize = function () { |
|||
var offsetHei = document.documentElement.clientHeight; |
|||
self.tableHeight = offsetHei - 190; |
|||
}; |
|||
}, |
|||
created() { |
|||
this.getList(); |
|||
}, |
|||
watch: { |
|||
customerInfos: { |
|||
handler(newVal) { |
|||
if (newVal == "" || newVal == "undefined") { |
|||
//TODO |
|||
} else { |
|||
newVal.forEach((element) => { |
|||
this.customerInfo.parentId = element.ParentId; |
|||
}); |
|||
if (this.customerInfo.parentId != "") { |
|||
this.getList(this.searchContent); |
|||
} |
|||
} |
|||
}, |
|||
immediate: true, |
|||
}, |
|||
}, |
|||
computed: { |
|||
/** 列表字段 */ |
|||
getDefaultField() { |
|||
var tempsTabs = []; |
|||
tempsTabs.push({ label: "客户零件代码", prop: "partCode ", width: 120 }); |
|||
tempsTabs.push({ label: "客户零件数量", prop: "partNum", width: 160 }); |
|||
tempsTabs.push({ label: "是否Key件", prop: "isKey", width: 95 }); |
|||
tempsTabs.push({ label: "描述", prop: "description", width: 280 }); |
|||
return tempsTabs; |
|||
}, |
|||
}, |
|||
methods: { |
|||
/** 刷新列表 */ |
|||
handleHandle(data) { |
|||
if (data.type !== "edit") { |
|||
this.getList(); |
|||
} |
|||
}, |
|||
/** 格式化字段 */ |
|||
fieldFormatter(row, column) { |
|||
if (column.property === "isKey") { |
|||
return { 0: "未生效", 1: "已生效" }[row[column.property]]; |
|||
} |
|||
return row[column.property] || "--"; |
|||
}, |
|||
importExcelData() { |
|||
//关闭导入窗体时调用 |
|||
this.showExcelImport = false; |
|||
this.getList(); |
|||
}, |
|||
getList(partCode) { |
|||
this.listLoading = true; |
|||
console.log("详表条件:" + JSON.stringify(this.customerInfo.parentId)); |
|||
this.$axios |
|||
.gets("/api/newjit/assembly-cfg-erp/" + this.customerInfo.parentId) |
|||
.then((response) => { |
|||
console.log(partCode) |
|||
if(partCode !== "" && partCode !== undefined) |
|||
{ |
|||
//console.log(partCode) |
|||
this.list = response.item.details.filter(u => u.partCode === partCode); |
|||
} |
|||
else |
|||
{ |
|||
this.list = response.item.details; |
|||
} |
|||
//alert(JSON.stringify(response.Items)) |
|||
//this.totalCount = response.totalCount; |
|||
setTimeout(() => { |
|||
//大数据量加载时 |
|||
this.listLoading = false; |
|||
}, 500); |
|||
}) |
|||
.catch(() => { |
|||
this.listLoading = false; |
|||
}); |
|||
}, |
|||
/** 筛选操作 */ |
|||
handleFilter() { |
|||
this.page = 1; |
|||
this.getList(); |
|||
this.listQuery.Filters = []; |
|||
if (this.searchContent != "") { |
|||
var column = "partCode"; |
|||
let filter = { |
|||
logic: 0, |
|||
column: column, |
|||
action: 6, |
|||
value: this.searchContent, |
|||
}; |
|||
this.listQuery.Filters.push(filter); |
|||
} |
|||
//console.log(this.searchContent) |
|||
this.getList(this.searchContent); |
|||
}, |
|||
resetQuery() {}, |
|||
|
|||
sortChange(data) { |
|||
const { prop, order } = data; |
|||
if (!prop || !order) { |
|||
this.handleFilter(); |
|||
return; |
|||
} |
|||
this.listQuery.Sorting = prop + " " + order; |
|||
this.handleFilter(); |
|||
}, |
|||
handleSelectionChange(val) { |
|||
this.multipleSelection = val; |
|||
}, |
|||
/** 通过回调控制style */ |
|||
cellStyle({ row, column, rowIndex, columnIndex }) { |
|||
if ( |
|||
column.property === "fisQty" || |
|||
column.property === "diffQty" || |
|||
column.property === "stockQty" |
|||
) { |
|||
return { textAlign: "right" }; |
|||
} else { |
|||
return { textAlign: "left" }; |
|||
} |
|||
}, |
|||
/** 通过回调控制表头style */ |
|||
headerRowStyle({ row, column, rowIndex, columnIndex }) { |
|||
if ( |
|||
column.property === "fisQty" || |
|||
column.property === "diffQty" || |
|||
column.property === "stockQty" |
|||
) { |
|||
return { textAlign: "right", background: "#FAFAFA" }; |
|||
} else { |
|||
return { textAlign: "left", background: "#FAFAFA" }; |
|||
} |
|||
}, |
|||
handleRowClick(row, column, event) { |
|||
this.$refs.multipleTable.clearSelection(); |
|||
this.$refs.multipleTable.toggleRowSelection(row); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
|
|||
<style lang="scss" scoped> |
|||
@import "../../styles/crmtable.scss"; |
|||
</style> |
|||
|
@ -0,0 +1,844 @@ |
|||
<!--总成模块信息管理页--> |
|||
<template> |
|||
<div class="cr-body-content"> |
|||
<div ref="box"> |
|||
<flexbox class="content-header"> |
|||
<el-form |
|||
:model="listQuery" |
|||
ref="queryForm" |
|||
v-show="showSearch" |
|||
:inline="true" |
|||
> |
|||
|
|||
<el-form-item label="总成编码" prop="ErpAssemblyCode " class="forimitem"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyCode" |
|||
placeholder="请输入总成编码" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="总成名称" prop="ErpAssemblyName " class="forimitem"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="请输入总成名称" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="车型:" prop="vehicleModelCode" class="forimitem"> |
|||
<el-select |
|||
v-model="listQuery.vehicleModelCode" |
|||
clearable |
|||
placeholder="请选择" |
|||
size="medium" |
|||
style="margin-right: 15px" |
|||
@change="valueselectChange" |
|||
> |
|||
<el-option label="结算" value="R0003"></el-option> |
|||
<el-option label="二配" value="R0001"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item class="forimitem"> |
|||
<el-button |
|||
type="primary" |
|||
icon="el-icon-search" |
|||
size="mini" |
|||
@click="handleFilter" |
|||
>搜索</el-button |
|||
> |
|||
<el-button |
|||
icon="el-icon-refresh" |
|||
size="mini" |
|||
@click="resetQuery('queryForm')" |
|||
>重置</el-button |
|||
> |
|||
<el-button |
|||
type="warning" |
|||
plain |
|||
icon="el-icon-download" |
|||
size="mini" |
|||
style="margin-left: 15px" |
|||
@click="handleDownload()" |
|||
>导出(Excel) |
|||
</el-button> |
|||
</el-form-item> |
|||
<el-divider class="divider1" ></el-divider> |
|||
<el-form-item style="margin-bottom: 0px;margin-top: 10px"> |
|||
<el-button |
|||
class="filter-item" |
|||
size="mini" |
|||
type="primary" |
|||
icon="el-icon-plus" |
|||
@click="handleCreate" |
|||
>新增 |
|||
</el-button> |
|||
<el-button |
|||
class="filter-item" |
|||
size="mini" |
|||
type="primary" |
|||
icon="el-icon-edit" |
|||
@click="handleUpdate" |
|||
>修改 |
|||
</el-button> |
|||
<el-button |
|||
class="filter-item" |
|||
size="mini" |
|||
type="primary" |
|||
icon="el-icon-delete" |
|||
@click="handleDelete" |
|||
>删除 |
|||
</el-button> |
|||
<el-button |
|||
class="filter-item" |
|||
size="mini" |
|||
type="primary" |
|||
icon="el-icon-plus" |
|||
@click="handleImportSAP" |
|||
>导入(SAP对接) |
|||
</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
</flexbox> |
|||
</div> |
|||
<div class="l-table"> |
|||
<!--表格渲染--> |
|||
<el-table |
|||
ref="multipleTable" |
|||
v-loading="listLoading" |
|||
element-loading-text="拼命加载中..." |
|||
element-loading-spinner="el-icon-loading" |
|||
class="cr-table" |
|||
:data="list" |
|||
:height="tableHeight" |
|||
:cell-style="cellStyle" |
|||
:header-cell-style="headerRowStyle" |
|||
size="small" |
|||
stripe |
|||
border |
|||
highlight-current-row |
|||
style="width: 100%" |
|||
@sort-change="sortChange" |
|||
@selection-change="handleSelectionChange" |
|||
@row-click="handleRowClick" |
|||
> |
|||
<el-table-column type="selection" width="44px"></el-table-column> |
|||
<el-table-column |
|||
label="ERP总成编码" |
|||
prop="erpAssemblyCode" |
|||
sortable="custom" |
|||
align="center" |
|||
width="420px" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<span class="link-type" @click="handleDrawerOpen(scope.row)">{{ |
|||
scope.row.erpAssemblyCode |
|||
}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="ERP总成名称" |
|||
prop="erpAssemblyName " |
|||
sortable="custom" |
|||
align="center" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<span>{{ scope.row.erpAssemblyName }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="ERP总成版本" |
|||
prop="erpAssemblyVersion " |
|||
sortable="custom" |
|||
align="center" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<span>{{ scope.row.erpAssemblyVersion }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
label="车型" |
|||
prop="vehicleModel " |
|||
sortable="custom" |
|||
align="center" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<span>{{ scope.row.model }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
|
|||
<!--表单渲染--> |
|||
<el-dialog |
|||
:visible.sync="dialogFormVisible" |
|||
:close-on-click-modal="false" |
|||
:title="formTitle" |
|||
width="700px" |
|||
> |
|||
<el-form |
|||
ref="form" |
|||
:inline="true" |
|||
:model="form" |
|||
:rules="rules" |
|||
size="small" |
|||
label-width="120px" |
|||
> |
|||
<el-row> |
|||
<el-col :span="4"> |
|||
<el-form-item label="总成编码:" required /> |
|||
</el-col> |
|||
<el-col :span="20"> |
|||
<el-form-item prop="erpAssemblyCode "> |
|||
<el-input |
|||
style="width: 400px" |
|||
v-model="form.erpAssemblyCode" |
|||
:disabled="isEdit" |
|||
/> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
|
|||
<el-row> |
|||
<el-col :span="4"> |
|||
<el-form-item label="总成名称:" required /> |
|||
</el-col> |
|||
<el-col :span="20"> |
|||
<el-form-item prop="erpAssemblyName "> |
|||
<el-input |
|||
style="width: 400px" |
|||
v-model="form.erpAssemblyName" |
|||
:disabled="isEdit" |
|||
/> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
|
|||
<el-row> |
|||
<el-col :span="4"> |
|||
<el-form-item label="总成类型:" required /> |
|||
</el-col> |
|||
<el-col :span="20"> |
|||
<el-form-item prop="erpAssemblyType "> |
|||
<el-input |
|||
style="width: 200px" |
|||
v-model="form.erpAssemblyType" |
|||
:disabled="isEdit" |
|||
/> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
|
|||
<el-row> |
|||
<el-col :span="4"> |
|||
<el-form-item label="车型:" required /> |
|||
</el-col> |
|||
<el-col :span="20"> |
|||
<el-form-item prop="vehicleModel "> |
|||
<el-input |
|||
style="width: 200px" |
|||
v-model="form.model" |
|||
:disabled="isEdit" |
|||
/> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
<el-row> |
|||
<el-table |
|||
ref="DetialTable" |
|||
v-loading="listLoading" |
|||
element-loading-text="拼命加载中..." |
|||
element-loading-spinner="el-icon-loading" |
|||
class="cr-table" |
|||
:data="form.details" |
|||
:height="detailTableHeight" |
|||
:cell-style="cellStyle" |
|||
:header-cell-style="headerRowStyle" |
|||
size="small" |
|||
stripe |
|||
border |
|||
highlight-current-row |
|||
style="width: 100%" |
|||
@row-click="handleRowClick" |
|||
> |
|||
<!-- <el-table-column type="selection" width="44px"></el-table-column> --> |
|||
<el-table-column prop="partCode" label="客户零件代码" width="150px" > |
|||
<template slot-scope="scope"> |
|||
<el-input v-model="scope.row.partCode" size="mini" style="width:135px"></el-input> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="description" label="客户零件名称"> |
|||
<template slot-scope="scope"> |
|||
<el-input v-model="scope.row.description" size="mini"></el-input> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="partNum" label="客户零件数量" width="120px" > |
|||
<template slot-scope="scope"> |
|||
<el-input-number v-model="scope.row.partNum" :min="1" size="mini" style="width:100px"></el-input-number> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="isKey" label="是否Key件" align="center" width="80px" > <!-- label-class-name="DisabledSelection" 去除列头全选--> |
|||
<template slot-scope="scope"> |
|||
<el-checkbox v-model="scope.row.isKey"></el-checkbox> |
|||
</template> |
|||
</el-table-column> |
|||
<!-- <el-table-column prop="description" label="描述"> |
|||
<template slot-scope="scope"> |
|||
<el-input v-model="scope.row.disdescriptionKey"></el-input> |
|||
</template> |
|||
</el-table-column> --> |
|||
<el-table-column prop="description" width="35px"> |
|||
<template slot="header"> |
|||
<el-button @click="handleAddDetails" icon="el-icon-plus" type="text"></el-button> |
|||
</template> |
|||
<template slot-scope="scope"> |
|||
<el-button @click="handleDeleteDetails(scope.$index, scope.row)" icon="el-icon-minus" type="text"></el-button> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
</el-row> |
|||
</el-form> |
|||
<!--表格渲染--> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button type="text" @click="dialogFormVisible = false" |
|||
>取消</el-button |
|||
> |
|||
<el-button v-loading="formLoading" type="primary" @click="save" |
|||
>确认</el-button |
|||
> |
|||
</div> |
|||
</el-dialog> |
|||
</div> |
|||
|
|||
<div class="table-footer"> |
|||
<!-- 分页控件 style="margin-top: -25px;margin-bottom:-25px;float:right;"--> |
|||
<pagination |
|||
v-show="totalCount > 0" |
|||
:total="totalCount" |
|||
:page.sync="page" |
|||
:limit.sync="listQuery.MaxResultCount" |
|||
@pagination="getList" |
|||
/> |
|||
</div> |
|||
<!-- 抽屉控件 --> |
|||
<el-drawer |
|||
title="信息详细页" |
|||
size="75%" |
|||
direction="rtl" |
|||
:visible.sync="drawer" |
|||
:before-close="handleDrawerClose" |
|||
> |
|||
<div> |
|||
<Detail |
|||
v-bind:customerInfos="customerInfos" |
|||
style="margin-top: -35px" |
|||
></Detail> |
|||
</div> |
|||
</el-drawer> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import Pagination from "@/components/Pagination"; |
|||
import permission from "@/directive/permission/index.js"; |
|||
import CRMTableHead from "../../components/CRMTableHead"; |
|||
import importExcel from "@/components/ImportExcel-vw"; |
|||
import Lockr from "lockr"; |
|||
import moment from "moment"; |
|||
import Detail from "./detail.vue"; |
|||
import { downloadFile } from "@/utils/crmindex.js"; |
|||
|
|||
//组件计量单位 |
|||
const bomUnit = [ |
|||
{ key: 0, display_name: "PC" }, |
|||
{ key: 1, display_name: "TON" }, |
|||
{ key: 2, display_name: "Other" }, |
|||
]; |
|||
const projectTypeKeyValue = bomUnit.reduce((acc, cur) => { |
|||
acc[cur.key] = cur.display_name; |
|||
return acc; |
|||
}, {}); |
|||
|
|||
export default { |
|||
name: "AssemblyCfgERP", |
|||
components: { Pagination, CRMTableHead, importExcel, Detail }, |
|||
directives: { permission }, |
|||
filters: { |
|||
IsCustomerSignFilter(status) { |
|||
//翻译是否签字 |
|||
const statusMap = { |
|||
true: "是", |
|||
false: "否", |
|||
}; |
|||
return statusMap[status]; |
|||
}, |
|||
}, |
|||
data() { |
|||
const validVersion = (rule, value, callback) => { |
|||
let numberReg = /^\d{6}$/; |
|||
if (!numberReg.test(value)) { |
|||
callback(new Error("只能为6位数字!")); |
|||
} else { |
|||
callback(); |
|||
} |
|||
}; |
|||
return { |
|||
crmType: "AssemblyCfgERP", |
|||
rules: { |
|||
erpAssemblyName: [ |
|||
{ required: true, message: "必须输入!", trigger: "blur" }, |
|||
], |
|||
}, |
|||
valueSelect: "", |
|||
customerInfos: [], |
|||
dialogOptions: [], |
|||
versionValue: "", |
|||
searchContent: "", // 输入内容 |
|||
showExcelImport: false, |
|||
form: {}, |
|||
drawer: false, |
|||
list: null, |
|||
totalCount: 0, |
|||
listLoading: true, |
|||
customerInfo: { |
|||
bomId: "", |
|||
}, |
|||
// 高级搜索 |
|||
filterObj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {}; |
|||
}, |
|||
}, |
|||
listQuery: { |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
ErpAssemblyName: undefined, |
|||
ErpAssemblyCode: undefined, |
|||
vehicleModel:undefined, |
|||
}, |
|||
listExportQuery: { |
|||
erpAssemblyCode: undefined, |
|||
erpAssemblyName: undefined, |
|||
}, |
|||
form:{ |
|||
details:[] |
|||
}, |
|||
page: 1, |
|||
// 显示搜索条件 |
|||
showSearch: true, |
|||
bomUnit, |
|||
multipleSelection: [], |
|||
drawer: false, |
|||
dialogFormVisible: false, |
|||
formTitle: "", |
|||
isEdit: false, |
|||
formLoading: false, |
|||
dialogFormVisible: false, |
|||
tableHeight: document.documentElement.clientHeight - 280, |
|||
detailTableHeight:250, |
|||
details:[] //修改子表数据源 |
|||
}; |
|||
}, |
|||
mounted() { |
|||
this.$nextTick(() => { |
|||
var offsetHei = document.documentElement.clientHeight; |
|||
//console.log(offsetHei); |
|||
let boxH = this.$refs.box.offsetHeight; |
|||
this.tableHeight = offsetHei - boxH - 57 - 79;//57为footer高度,79为页面上部标签高度 |
|||
//console.log(boxH); |
|||
//console.log(this.tableHeight); |
|||
}); |
|||
}, |
|||
created() { |
|||
this.getList(); |
|||
}, |
|||
computed: { |
|||
getDefaultField() { |
|||
var tempsTabs = []; |
|||
// tempsTabs.push({ |
|||
// label: "ERP总成名称", |
|||
// prop: "erpAssemblyName ", |
|||
// width: 220, |
|||
// }); |
|||
tempsTabs.push({ |
|||
label: "ERP总成版本", |
|||
prop: "erpAssemblyVersion ", |
|||
width: 100, |
|||
}); |
|||
return tempsTabs; |
|||
}, |
|||
}, |
|||
methods: { |
|||
//抽屉 |
|||
handleDrawerOpen(param) { |
|||
this.drawer = true; |
|||
var parentId = param.id; //主键id |
|||
this.customerInfos = [ |
|||
{ |
|||
ParentId: parentId, |
|||
}, |
|||
]; |
|||
}, |
|||
handleDrawerClose(done) { |
|||
done(); |
|||
}, |
|||
save() { |
|||
this.$refs.form.validate((valid) => { |
|||
if (valid) { |
|||
console.log("保存参数:" + JSON.stringify(this.form)); |
|||
this.formLoading = true; |
|||
if (this.isEdit) { |
|||
//修改 |
|||
this.$axios |
|||
.puts("/api/newjit/assembly-cfg-erp/" + this.form.id, this.form) |
|||
.then((response) => { |
|||
this.formLoading = false; |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "更新成功", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
this.dialogFormVisible = false; |
|||
this.getList(); |
|||
}) |
|||
.catch(() => { |
|||
this.formLoading = false; |
|||
}); |
|||
} else { |
|||
//insert添加 |
|||
console.log(JSON.stringify(this.form)); |
|||
this.$axios |
|||
.posts("/api/newjit/assembly-cfg-erp", this.form) |
|||
.then((response) => { |
|||
this.formLoading = false; |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "新增成功", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
this.dialogFormVisible = false; |
|||
this.getList(); |
|||
}) |
|||
.catch(() => { |
|||
this.formLoading = false; |
|||
}); |
|||
} |
|||
} |
|||
}); |
|||
}, |
|||
/** 新增 */ |
|||
handleCreate() { |
|||
if (this.$refs["form"] !== undefined) { |
|||
this.$nextTick(() => { |
|||
this.$refs["form"].resetFields(); |
|||
}); |
|||
} |
|||
this.formTitle = "新增"; |
|||
this.isEdit = false; |
|||
this.form = {}; |
|||
this.details = []; |
|||
this.dialogFormVisible = true; |
|||
}, |
|||
/** 修改 */ |
|||
handleUpdate(row) { |
|||
this.formTitle = "修改"; |
|||
this.isEdit = true; |
|||
this.details = []; |
|||
if (this.multipleSelection.length != 1) { |
|||
this.$message({ |
|||
message: "编辑必须选择单行", |
|||
type: "warning", |
|||
}); |
|||
return; |
|||
} else { |
|||
this.fetchData(this.multipleSelection[0].id); |
|||
this.dialogFormVisible = true; |
|||
} |
|||
}, |
|||
/** 删除 */ |
|||
handleDelete(row) { |
|||
if (this.multipleSelection.length != 1) { |
|||
this.$message({ |
|||
message: "编辑必须选择单行", |
|||
type: "warning", |
|||
}); |
|||
return; |
|||
} |
|||
// this.$alert("暂时不支持批量删除", "提示", { |
|||
// confirmButtonText: "确定", |
|||
// callback: (action) => { |
|||
// // |
|||
// }, |
|||
// }); |
|||
this.$confirm("是否删除总成" + this.multipleSelection[0].erpAssemblyCode + "?", "提示", { |
|||
confirmButtonText: "确定", |
|||
cancelButtonText: "取消", |
|||
type: "warning", |
|||
}) |
|||
.then(() => { |
|||
this.$axios |
|||
.deletes("/api/newjit/assembly-cfg-erp/"+ this.multipleSelection[0].id) |
|||
.then((response) => { |
|||
const index = this.list.indexOf(this.multipleSelection[0]); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "删除成功", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
this.getList(); |
|||
}); |
|||
}) |
|||
.catch(() => { |
|||
this.$message({ |
|||
type: "info", |
|||
message: "已取消删除", |
|||
}); |
|||
}); |
|||
}, |
|||
fetchData(id) { |
|||
//循环动态 |
|||
this.$axios |
|||
.gets("/api/newjit/assembly-cfg-erp/" + id) |
|||
.then((response) => { |
|||
this.form = response.item; |
|||
//this.details = response.item.details; |
|||
//console.log(this.details); |
|||
}); |
|||
}, |
|||
/** 导出功能 */ |
|||
handleDownload() { |
|||
this.listLoading = true; |
|||
this.listExportQuery.erpAssemblyCode = this.listQuery.ErpAssemblyCode; |
|||
this.listExportQuery.erpAssemblyName = this.listQuery.ErpAssemblyName; |
|||
console.log(JSON.stringify(this.listExportQuery)); |
|||
this.$axios |
|||
.posts("/api/newjit/assembly-cfg-erp/export", this.listExportQuery) |
|||
.then((res) => { |
|||
let filename = res.item; |
|||
this.$axios |
|||
.BolbGets("/api/newjit/exclude-part-cfg/download/" + filename) |
|||
.then((response) => { |
|||
if (filename.indexOf("_") != -1) { |
|||
let downName = |
|||
filename.slice(0, filename.lastIndexOf("_")) + |
|||
filename.slice(filename.lastIndexOf(".")); |
|||
downloadFile(response, downName); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} else { |
|||
downloadFile(response, filename); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} |
|||
this.listLoading = false; |
|||
}); |
|||
}); |
|||
this.listLoading = false; |
|||
}, |
|||
/** 重置按钮操作 */ |
|||
resetQuery(refName) { |
|||
//this.$refs[refName].resetFields(); |
|||
this.listQuery.ErpAssemblyName = ""; |
|||
this.listQuery.ErpAssemblyCode = ""; |
|||
this.listQuery.vehicleModelCode = ""; |
|||
this.handleQuery(); |
|||
}, |
|||
/** 搜索按钮操作 */ |
|||
handleQuery() { |
|||
this.listQuery.SkipCount = 1; |
|||
this.getList(); |
|||
}, |
|||
selectValue(params) { |
|||
//版本下拉选择 |
|||
this.versionValue = params.value; |
|||
this.getList(); |
|||
}, |
|||
|
|||
selectOptionsChange(item) { |
|||
this.getList(); |
|||
}, |
|||
importExcelData() { |
|||
//关闭导入窗体时调用 |
|||
this.showExcelImport = false; |
|||
//this.getList(); |
|||
}, |
|||
|
|||
/** 刷新列表 */ |
|||
handleHandle(data) { |
|||
if (data.type !== "edit") { |
|||
this.getList(); |
|||
} |
|||
}, |
|||
|
|||
handleAddDetails() { |
|||
if (this.form.details === undefined) { |
|||
this.form.details = []; |
|||
//console.log(679); |
|||
} |
|||
let obj = {}; |
|||
obj.partCode = ""; |
|||
obj.description = ""; |
|||
obj.partNum = ""; |
|||
obj.isKey = false; |
|||
obj.description = ""; |
|||
|
|||
//console.log(this.form.details); |
|||
this.form.details.push(obj); |
|||
//console.log(688); |
|||
}, |
|||
handleDeleteDetails(index){ |
|||
this.form.details.splice(index, 1); |
|||
//console.log(693); |
|||
}, |
|||
|
|||
/** 格式化字段 */ |
|||
fieldFormatter(row, column) { |
|||
if (column.property === "billStatus") { |
|||
return { 0: "未生效", 2: "已生效", 3: "已发布" }[row[column.property]]; |
|||
} |
|||
if (column.property == "onlineTime" || column.property == "receiveTime") { |
|||
var date = row[column.property]; |
|||
if (date == undefined) { |
|||
return ""; |
|||
} |
|||
return moment(date).format("YYYY-MM-DD HH:mm:ss"); |
|||
} |
|||
return row[column.property] || "--"; |
|||
}, |
|||
roleFilter(type) { |
|||
return projectTypeKeyValue[type]; |
|||
}, |
|||
getList() { |
|||
this.listLoading = true; |
|||
this.listQuery.SkipCount = (this.page - 1) * 10; |
|||
this.$axios |
|||
.gets("/api/newjit/assembly-cfg-erp/list", this.listQuery) |
|||
.then((response) => { |
|||
this.list = response.items; |
|||
this.totalCount = response.totalCount; |
|||
setTimeout(() => { |
|||
//大数据量加载时 |
|||
this.listLoading = false; |
|||
}, 500); |
|||
}) |
|||
.catch(() => { |
|||
this.listLoading = false; |
|||
}); |
|||
}, |
|||
|
|||
|
|||
getDetialList(partCode) { |
|||
this.listLoading = true; |
|||
console.log("详表条件:" + JSON.stringify(this.customerInfo.parentId)); |
|||
this.$axios |
|||
.gets("/api/newjit/assembly-cfg-erp/" + this.customerInfo.parentId) |
|||
.then((response) => { |
|||
console.log(partCode) |
|||
if(partCode !== "" && partCode !== undefined) |
|||
{ |
|||
//console.log(partCode) |
|||
this.list = response.item.details.filter(u => u.partCode === partCode); |
|||
} |
|||
else |
|||
{ |
|||
this.list = response.item.details; |
|||
} |
|||
//alert(JSON.stringify(response.Items)) |
|||
//this.totalCount = response.totalCount; |
|||
setTimeout(() => { |
|||
//大数据量加载时 |
|||
this.listLoading = false; |
|||
}, 500); |
|||
}) |
|||
.catch(() => { |
|||
this.listLoading = false; |
|||
}); |
|||
}, |
|||
|
|||
valueselectChange(){}, |
|||
handleImportSAP(){}, |
|||
|
|||
handleFilter() { |
|||
this.page = 1; |
|||
this.getList(); |
|||
}, |
|||
|
|||
sortChange(data) { |
|||
const { prop, order } = data; |
|||
if (!prop || !order) { |
|||
this.handleFilter(); |
|||
return; |
|||
} |
|||
this.listQuery.Sorting = prop + " " + order; |
|||
this.handleFilter(); |
|||
}, |
|||
handleSelectionChange(val) { |
|||
this.multipleSelection = val; |
|||
}, |
|||
/** 通过回调控制style */ |
|||
cellStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right" }; |
|||
} else { |
|||
return { textAlign: "left" }; |
|||
} |
|||
}, |
|||
/** 通过回调控制表头style */ |
|||
headerRowStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right", background: "#FAFAFA" }; |
|||
} else { |
|||
return { textAlign: "left", background: "#FAFAFA" }; |
|||
} |
|||
}, |
|||
handleRowClick(row, column, event) { |
|||
this.$refs.multipleTable.clearSelection(); |
|||
this.$refs.multipleTable.toggleRowSelection(row); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
|
|||
<style lang="scss" scoped> |
|||
@import "../../../ux/styles/crmtable.scss"; |
|||
|
|||
// /*表格全选框去除空框*/ |
|||
// .el-table >>> .DisabledSelection .cell .el-checkbox__inner { |
|||
// display: none; |
|||
// position: relative; |
|||
// } |
|||
// /*表格全选框改为:选择*/ |
|||
// .el-table >>> .DisabledSelection .cell:before { |
|||
// content: "是否Key件"; |
|||
// position: absolute; |
|||
// left: 7px; |
|||
// } |
|||
.divider1{ |
|||
margin: 0 ; |
|||
width: 118%; |
|||
} |
|||
.formitem{ |
|||
margin-bottom: 0; |
|||
} |
|||
</style> |
|||
|
@ -0,0 +1,740 @@ |
|||
<!--零件匹配关系页--> |
|||
<template> |
|||
<div class="cr-body-content"> |
|||
<div ref="box"> |
|||
<flexbox class="content-header"> |
|||
|
|||
<el-form |
|||
:model="listQuery" |
|||
ref="queryForm" |
|||
v-show="showSearch" |
|||
:inline="true" |
|||
> |
|||
<!-- <span>版本:</span> |
|||
|
|||
<XhJSSelect |
|||
:options="versionList" |
|||
style="width: 200px" |
|||
class="search-container" |
|||
@value-change="selectValue" |
|||
></XhJSSelect> --> |
|||
|
|||
|
|||
<el-form-item label="零件代码:" prop="partCode"> |
|||
<el-input |
|||
v-model="partCode" |
|||
clearable |
|||
size="small" |
|||
placeholder="" |
|||
style="width: 200px" |
|||
class="search-container" |
|||
@keyup.enter.native="handleFilter" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="零件名称:" prop="partName"> |
|||
<el-input |
|||
v-model="partName" |
|||
clearable |
|||
size="small" |
|||
placeholder="" |
|||
style="width: 200px" |
|||
class="search-container" |
|||
@keyup.enter.native="handleFilter" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="零件类型:" prop="partType"> |
|||
<el-select |
|||
v-model="partType" |
|||
clearable |
|||
placeholder="请选择" |
|||
size="medium" |
|||
style="margin-right: 15px" |
|||
@change="valueselectChange" |
|||
> |
|||
<el-option label="结算" value="R0003"></el-option> |
|||
<el-option label="二配" value="R0001"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="零件子类型:" prop="partChildType"> |
|||
<el-select |
|||
v-model="partChildType" |
|||
clearable |
|||
placeholder="请选择" |
|||
size="medium" |
|||
style="margin-right: 15px" |
|||
@change="valueselectChange" |
|||
> |
|||
<el-option label="结算" value="R0003"></el-option> |
|||
<el-option label="二配" value="R0001"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-input |
|||
v-model="searchContent" |
|||
clearable |
|||
size="small" |
|||
placeholder="按照结算件基本信息搜索..." |
|||
style="width: 200px" |
|||
class="search-container" |
|||
@keyup.enter.native="handleFilter" |
|||
/> --> |
|||
<el-form-item> |
|||
<el-button |
|||
size="mini" |
|||
type="success" |
|||
icon="el-icon-search" |
|||
@click="handleFilter" |
|||
>搜索 |
|||
</el-button> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button |
|||
icon="el-icon-refresh" |
|||
size="mini" |
|||
@click="resetQuery('queryForm')" |
|||
>重置 |
|||
</el-button> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button |
|||
class="filter-item" |
|||
plain |
|||
size="mini" |
|||
type="warning" |
|||
icon="el-icon-bottom" |
|||
@click="handleDownload()" |
|||
>导出Excel |
|||
</el-button> |
|||
</el-form-item> |
|||
<!--表格头组件,filter查询--> |
|||
<!-- <c-r-m-table-head |
|||
ref="crmTableHead" |
|||
:crm-type="crmType" |
|||
@handle="handleHandle" |
|||
@filter="handleFilters" |
|||
> |
|||
</c-r-m-table-head> --> |
|||
</el-form> |
|||
</flexbox> |
|||
</div> |
|||
<!--表格渲染--> |
|||
<el-table |
|||
ref="multipleTable" |
|||
v-loading.fullscreen.lock="listLoading" |
|||
element-loading-text="拼命加载中..." |
|||
element-loading-spinner="el-icon-loading" |
|||
class="cr-table" |
|||
:data="list" |
|||
:height="tableHeight" |
|||
:cell-style="cellStyle" |
|||
:header-cell-style="headerRowStyle" |
|||
size="small" |
|||
stripe |
|||
border |
|||
highlight-current-row |
|||
style="width: 100%" |
|||
@sort-change="sortChange" |
|||
@selection-change="handleSelectionChange" |
|||
@row-click="handleRowClick" |
|||
> |
|||
<!-- <el-table-column type="selection" width="44px"></el-table-column> --> |
|||
<!-- <el-table-column |
|||
label="版本" |
|||
prop="version" |
|||
sortable="custom" |
|||
align="center" |
|||
width="100px" |
|||
>fixed 默认固定在左边 |
|||
<template slot-scope="scope"> |
|||
<el-tooltip :content="scope.row.version" placement="top"> |
|||
<span class="link-type">{{ scope.row.version }}</span> |
|||
</el-tooltip> |
|||
</template> |
|||
</el-table-column> --> |
|||
<el-table-column |
|||
v-for="(item, index) in getDefaultField" |
|||
:key="index" |
|||
:prop="item.prop" |
|||
:label="item.label" |
|||
:min-width="item.width" |
|||
:formatter="fieldFormatter" |
|||
sortable="custom" |
|||
show-overflow-tooltip |
|||
:gutter="0" |
|||
> |
|||
<template slot="header" slot-scope="scope"> |
|||
{{ scope.column.label }} |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<div class="table-footer"> |
|||
<!-- 分页控件 style="margin-top: -25px;margin-bottom:-25px;float:right;"--> |
|||
<pagination |
|||
v-show="totalCount > 0" |
|||
:total="totalCount" |
|||
:page.sync="page" |
|||
:limit.sync="listQuery.MaxResultCount" |
|||
@pagination="getList" |
|||
/> |
|||
<!-- 导入Excel组件 --> |
|||
<importExcel |
|||
ref="importexcel" |
|||
:show="showExcelImport" |
|||
:crmType="crmType" |
|||
@close="importExcelData" |
|||
/> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination |
|||
import permission from "@/directive/permission/index.js"; |
|||
import importExcel from "@/components/ImportExcel-invoice"; |
|||
import CRMTableHead from "../../components/CRMTableHead"; |
|||
import moment from "moment"; |
|||
import Lockr from "lockr"; |
|||
import { downloadFile } from "@/utils/crmindex.js"; |
|||
import XhJSSelect from "@/components/CreateCom/Xh-JS-Select-Label.vue"; |
|||
|
|||
export default { |
|||
name: "CustomerPartCfg", |
|||
components: { Pagination, CRMTableHead, importExcel, XhJSSelect }, |
|||
directives: { permission }, |
|||
filters: { |
|||
IsCustomerSignFilter(status) { |
|||
//翻译是否签字 |
|||
const statusMap = { |
|||
true: "是", |
|||
false: "否", |
|||
}; |
|||
return statusMap[status]; |
|||
}, |
|||
}, |
|||
props: { |
|||
customerInfos: { |
|||
type: Array, |
|||
default: () => { |
|||
return []; |
|||
}, |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
crmType: "customerPartCfg", |
|||
versionValue: "", |
|||
//valueSelect: "R0003", |
|||
versionList: [], //版本列表 |
|||
rules: { |
|||
//前端定义的规则,后端也有验证 |
|||
erpMaterialCode: [ |
|||
{ required: true, message: "必须输入!", trigger: "blur" }, |
|||
], |
|||
}, |
|||
searchContent: "", // 输入内容 |
|||
customerInfo: { |
|||
settleAccountId: "", |
|||
}, |
|||
form: { |
|||
dicDetailID: "", |
|||
customerId: "", |
|||
projectId: "", |
|||
}, |
|||
list: null, |
|||
totalCount: 0, |
|||
listLoading: true, |
|||
formLoading: false, |
|||
// 高级搜索 |
|||
filterObj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {}; |
|||
}, |
|||
}, |
|||
listVersionQuery: { |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
}, |
|||
listQuery: { |
|||
Filters: [ |
|||
{ |
|||
logic: 0, |
|||
column: "Enabled", |
|||
action: 0, |
|||
value: "true", |
|||
}, //默认查询可用的 |
|||
], |
|||
//OrgID:"", |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
version: "", |
|||
//site: "TH", |
|||
customerCode: "", |
|||
//userId: "00000000-0000-0000-0000-000000000000", |
|||
partCode:"",//零件编码 |
|||
partName:"",//零件名称 |
|||
partType:"",//零件类型 |
|||
partChildType:"",//零件子类型 |
|||
}, |
|||
listExportQuery: { |
|||
Filters: [ |
|||
{ |
|||
logic: 0, |
|||
column: "Enabled", |
|||
action: 0, |
|||
value: "true", |
|||
}, //默认查询可用的 |
|||
], |
|||
//OrgID:"", |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
version: "", |
|||
fileType: 0, |
|||
userId: "", |
|||
}, |
|||
showSearch: true, |
|||
page: 1, |
|||
dialogFormVisible: false, |
|||
multipleSelection: [], |
|||
formTitle: "", |
|||
drawer: false, |
|||
showExcelImport: false, |
|||
tableHeight: document.documentElement.clientHeight - 260, |
|||
isEdit: false, |
|||
sortState:false, //标记刷新是否是排序调用 |
|||
|
|||
partCode:'', |
|||
partName:'', |
|||
partType:'', |
|||
partChildType:'', |
|||
|
|||
}; |
|||
}, |
|||
mounted() { |
|||
this.$nextTick(() => { |
|||
var offsetHei = document.documentElement.clientHeight; |
|||
console.log(offsetHei); |
|||
let boxH = this.$refs.box.offsetHeight; |
|||
this.tableHeight = offsetHei - boxH - 57 - 79;//57为footer高度,79为页面上部标签高度 |
|||
console.log(this.$refs.box.offsetHeight); |
|||
console.log(this.tableHeight); |
|||
}); |
|||
}, |
|||
created() { |
|||
//this.getVersionInfo(); |
|||
//if (this.versionList == []) { |
|||
this.getList(); |
|||
//} |
|||
}, |
|||
computed: { |
|||
/** 列表字段 */ |
|||
getDefaultField() { |
|||
var tempsTabs = []; |
|||
|
|||
tempsTabs.push({ |
|||
label: "零件代码", |
|||
prop: "partCode", |
|||
width: 100, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "零件名称", |
|||
prop: "partName", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "零件类型", |
|||
prop: "partType", |
|||
width: 120 |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "零件子类型", |
|||
prop: "partChildType", |
|||
width: 120, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "零件描述", |
|||
prop: "Description", |
|||
width: 150, |
|||
}); |
|||
return tempsTabs; |
|||
}, |
|||
}, |
|||
methods: { |
|||
selectValue(params) { |
|||
//版本下拉选择 |
|||
this.versionValue = params.value; |
|||
this.getList(); |
|||
}, |
|||
valueselectChange(data) { |
|||
//alert(data); |
|||
//版本下拉选择 |
|||
this.valueSelect = data; |
|||
this.getList(); |
|||
}, |
|||
handleTypeDrop(command, params = {}) { |
|||
if (command == "updateFis") { |
|||
this.listLoading = true; |
|||
//this.listQuery.SkipCount = (this.page - 1) * 10000; |
|||
this.$axios |
|||
.posts("/api/settleaccount/SettlementPart/updateFis") |
|||
.then((res) => { |
|||
if (res == true) { |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "FIS数据-更新成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} else { |
|||
this.$message({ |
|||
type: "warning", |
|||
message: "FIS数据-更新失败!", |
|||
}); |
|||
} |
|||
this.listLoading = false; |
|||
}); |
|||
} else if (command == "enter") { |
|||
} |
|||
}, |
|||
selectOptionsChange(item) { |
|||
this.getList(); |
|||
}, |
|||
getVersionInfo() { |
|||
//取版本列表信息 |
|||
//this.listLoading = true; |
|||
this.listVersionQuery.SkipCount = (this.page - 1) * 1000; |
|||
this.$axios |
|||
.posts( |
|||
"/api/settleaccount/SettlementPart/versionlist", |
|||
this.listVersionQuery |
|||
) |
|||
.then((response) => { |
|||
this.versionList = []; |
|||
response.items.forEach((element) => { |
|||
let options = {}; |
|||
options.value = element.id; |
|||
options.label = element.version; |
|||
this.versionList.push(options); |
|||
}); |
|||
const res = new Map() |
|||
this.versionList = this.versionList.filter((item) => !res.has(item.label) && res.set(item.label, 1)) |
|||
if (JSON.stringify(this.versionList) != "[]") { |
|||
//因版本下拉有默认值,所以详表要自动绑定子表数据 |
|||
this.versionValue = this.versionList[0].label; |
|||
this.getList(); |
|||
} |
|||
}) |
|||
.catch(() => { |
|||
//this.listLoading = false; |
|||
}); |
|||
}, |
|||
/** 刷新列表 */ |
|||
handleHandle(data) { |
|||
if (data.type !== "edit") { |
|||
this.getList(); |
|||
} |
|||
}, |
|||
/** 格式化字段 */ |
|||
fieldFormatter(row, column) { |
|||
/* if (column.property === "state") { |
|||
return { 0: "其他", 2: "已结" }[row[column.property]]; |
|||
} |
|||
if (column.property == "accountDate" || column.property == "date") { |
|||
var date = row[column.property]; |
|||
if (date == undefined) { |
|||
return ""; |
|||
} |
|||
//return moment(date).format("YYYY-MM-DD HH:mm:ss"); |
|||
return moment(date).format("YYYY-MM-DD"); |
|||
} */ |
|||
if(column.property === 'customerCode') |
|||
{ |
|||
if(row[column.property] === 'R0001') |
|||
{ |
|||
var vname = '二配'; |
|||
return vname; |
|||
} |
|||
else if(row[column.property] === 'R0003') |
|||
{ |
|||
var vname = '结算'; |
|||
return vname; |
|||
} |
|||
else |
|||
{ |
|||
return row[column.property]; |
|||
} |
|||
} |
|||
return row[column.property] || "--"; |
|||
}, |
|||
importExcelData() { |
|||
this.getVersionInfo(); |
|||
this.listLoading = false; |
|||
//关闭导入窗体时调用 |
|||
this.showExcelImport = false; |
|||
}, |
|||
//导出功能 |
|||
async handleDownload() { |
|||
this.listLoading = true; |
|||
if (this.versionValue === "") { |
|||
this.$message.error("必需选择版本!"); |
|||
this.listLoading = false; |
|||
return; |
|||
} |
|||
if (this.versionValue != "") { |
|||
this.listQuery.version = this.versionValue; |
|||
} |
|||
console.log("发票导出:" + JSON.stringify(this.listQuery)); |
|||
this.$axios |
|||
.posts( |
|||
"/api/settleaccount/SettlementPart/Export", |
|||
this.listQuery |
|||
) |
|||
.then((res) => { |
|||
let fileNameOfProject = res; |
|||
this.$axios |
|||
.BolbGets( |
|||
"/api/settleaccount/getblobfile/download/" + fileNameOfProject |
|||
) |
|||
.then((response) => { |
|||
if (fileNameOfProject.indexOf("_") != -1) { |
|||
let downName = |
|||
fileNameOfProject.slice( |
|||
0, |
|||
fileNameOfProject.lastIndexOf("_") |
|||
) + |
|||
fileNameOfProject.slice(fileNameOfProject.lastIndexOf(".")); |
|||
downloadFile(response, downName); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} else { |
|||
downloadFile(response, fileNameOfProject); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} |
|||
this.listLoading = false; |
|||
}); |
|||
}); |
|||
}, |
|||
getList() { |
|||
this.listLoading = true; |
|||
this.listQuery.SkipCount = (this.page - 1) * 10; |
|||
if (this.versionValue != "") { |
|||
this.listQuery.version = this.versionValue; |
|||
} |
|||
if (this.valueSelect != "") { |
|||
this.listQuery.customerCode = this.valueSelect; |
|||
} else { |
|||
this.listQuery.customerCode = ""; |
|||
} |
|||
console.log("列表查询条件:" + JSON.stringify(this.listQuery)); |
|||
this.$axios |
|||
.posts( |
|||
"/api/newjit/part-cfg/list", |
|||
this.listQuery |
|||
) |
|||
.then((response) => { |
|||
this.list = response.items; |
|||
this.list.forEach(item => { |
|||
if(item.customerCode === 'R0001') |
|||
{ |
|||
item.customerCode = '二配'; |
|||
} |
|||
else if(item.customerCode === 'R0003') |
|||
{ |
|||
item.customerCode = '结算'; |
|||
} |
|||
}); |
|||
this.totalCount = response.totalCount; |
|||
setTimeout(() => { |
|||
//大数据量加载时 |
|||
this.listLoading = false; |
|||
}, 500); |
|||
}) |
|||
.catch(() => { |
|||
this.listLoading = false; |
|||
}); |
|||
}, |
|||
fetchData(id) { |
|||
//循环动态 |
|||
this.$axios |
|||
.gets("/api/settleaccount/SettlementPart/" + id) |
|||
.then((response) => { |
|||
this.form = response; |
|||
}); |
|||
}, |
|||
/** 筛选操作 */ |
|||
handleFilter() { |
|||
this.page = 1; |
|||
//#region |
|||
/* |
|||
this.listQuery.Filters = []; |
|||
if (this.partCode != "") { |
|||
var column = "partCode"; |
|||
let filter = { |
|||
logic: 0, |
|||
column: column, |
|||
action: 0, |
|||
value: this.partCode, |
|||
}; |
|||
this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partCode") |
|||
this.listQuery.Filters.push(filter); |
|||
} |
|||
|
|||
if (this.partName != "") { |
|||
var column = "partName"; |
|||
let filter = { |
|||
logic: 0, |
|||
column: column, |
|||
action: 0, |
|||
value: this.partName, |
|||
}; |
|||
this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partName") |
|||
this.listQuery.Filters.push(filter); |
|||
} |
|||
|
|||
if (this.partType != "") { |
|||
var column = "partType"; |
|||
let filter = { |
|||
logic: 0, |
|||
column: column, |
|||
action: 0, |
|||
value: this.partType, |
|||
}; |
|||
this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partType") |
|||
this.listQuery.Filters.push(filter); |
|||
} |
|||
|
|||
if (this.partChildType != "") { |
|||
var column = "partChildType"; |
|||
let filter = { |
|||
logic: 0, |
|||
column: column, |
|||
action: 0, |
|||
value: this.partChildType, |
|||
}; |
|||
this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partChildType") |
|||
this.listQuery.Filters.push(filter); |
|||
} |
|||
*/ |
|||
//#endregion |
|||
this.getList(); |
|||
}, |
|||
/** 多项筛选操作 */ |
|||
/** 筛选操作 */ |
|||
handleFilters(data) { |
|||
if (data === null) { |
|||
this.listQuery.Filters = []; |
|||
this.getList(); //查询所有 |
|||
} else { |
|||
console.log(data) |
|||
this.filterObj = data; |
|||
console.log("筛选" + JSON.stringify(data)); |
|||
var offsetHei = document.documentElement.clientHeight; |
|||
var removeHeight = Object.keys(this.filterObj).length > 0 ? 310 : 240; |
|||
this.tableHeight = offsetHei - removeHeight; |
|||
this.currentPage = 1; |
|||
let Filter = []; |
|||
data.forEach((item) => { |
|||
let filter = {}; |
|||
if (item.formType === "datetime" || item.formType === "datetime") { |
|||
//日期类型的过滤条件是 (datetime >= a and datetime <=b) |
|||
filter["Column"] = item.fieldName; |
|||
filter["Logic"] = 0; |
|||
filter["Value"] = item.value[0]; |
|||
filter["Action"] = item.action; |
|||
Filter.push(filter); |
|||
|
|||
if (item.value[1] != null) { |
|||
filter["Value"] = item.value[1]; |
|||
filter["Action"] = 5; |
|||
Filter.push(filter); |
|||
} |
|||
} else { |
|||
filter["Column"] = item.fieldName; |
|||
filter["Value"] = item.value; |
|||
filter["Logic"] = 0; |
|||
filter["Action"] = item.action; |
|||
Filter.push(filter); |
|||
} |
|||
}); |
|||
console.log("筛选条件" + JSON.stringify(Filter)); |
|||
this.listQuery.Filters = Filter; |
|||
this.getList(); |
|||
} |
|||
}, |
|||
/** 重置按钮操作 */ |
|||
resetQuery(refName) { |
|||
this.OnlineTimeVale = []; |
|||
this.ReceiveTimeVale = []; |
|||
this.$refs[refName].resetFields(); |
|||
this.handleFilter(); |
|||
}, |
|||
sortChange(data) { |
|||
const { prop, order } = data; |
|||
if (!prop || !order) { |
|||
this.handleFilter(); |
|||
return; |
|||
} |
|||
this.listQuery.Sorting = prop + " " + order; |
|||
console.log(this.listQuery.Sorting); |
|||
if(this.listQuery.Filters.length>0 && this.listQuery.Filters[0].column === "Enabled") |
|||
{ |
|||
this.sortState = false; |
|||
} |
|||
else |
|||
{ |
|||
this.sortState = true; |
|||
} |
|||
this.handleFilter(); |
|||
}, |
|||
handleSelectionChange(val) { |
|||
this.multipleSelection = val; |
|||
}, |
|||
/** 通过回调控制style */ |
|||
cellStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right" }; |
|||
} else { |
|||
return { textAlign: "left" }; |
|||
} |
|||
}, |
|||
/** 通过回调控制表头style */ |
|||
headerRowStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right", background: "#FAFAFA" }; |
|||
} else { |
|||
return { textAlign: "left", background: "#FAFAFA" }; |
|||
} |
|||
}, |
|||
handleRowClick(row, column, event) { |
|||
this.$refs.multipleTable.clearSelection(); |
|||
this.$refs.multipleTable.toggleRowSelection(row); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
|
|||
<style lang="scss" scoped> |
|||
@import "../../styles/crmtable.scss"; |
|||
</style> |
|||
<style lang="scss"> |
|||
.el-table .cell.el-tooltip { |
|||
white-space: pre-wrap; |
|||
} |
|||
</style> |
|||
|
|||
|
File diff suppressed because it is too large
@ -0,0 +1,730 @@ |
|||
<!--总成模块信息管理页--> |
|||
<template> |
|||
<div class="cr-body-content"> |
|||
<div ref="box"> |
|||
<flexbox class="content-header" > |
|||
<el-form |
|||
:model="listQuery" |
|||
ref="queryForm" |
|||
v-show="showSearch" |
|||
:inline="true" |
|||
> |
|||
<!-- <el-row> --> |
|||
<el-form-item label="生产线:" prop="workLine"> |
|||
<el-select |
|||
v-model="listQuery.workLine" |
|||
clearable |
|||
placeholder="请选择" |
|||
size="medium" |
|||
style="margin-right: 15px" |
|||
@change="valueselectChange" |
|||
> |
|||
<el-option label="门板" value="R0003"></el-option> |
|||
<el-option label="二配" value="R0001"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="" prop="workLineCode"> |
|||
<el-select |
|||
v-model="listQuery.workLineCode" |
|||
clearable |
|||
placeholder="请选择" |
|||
size="medium" |
|||
style="margin-right: 15px" |
|||
@change="valueselectChange" |
|||
> |
|||
<el-option label="01-C8" value="01-C8"></el-option> |
|||
<el-option label="01-C9" value="01-C9"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="版本:" prop="Version"> |
|||
<el-input |
|||
v-model="listQuery.Version" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<!-- </el-row> --> |
|||
<el-form-item label="流水号:" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="-" prop="ErpAssemblyName "> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<!-- <el-row> --> |
|||
<el-form-item label="大众顺序号:" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="-" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="KNR:" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="-" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<!-- </el-row> --> |
|||
<!-- <el-row> --> |
|||
<el-form-item label="底盘号:" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="-" prop="ErpAssemblyName "> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="上线日期"> |
|||
<el-date-picker |
|||
v-model="listQuery.OnlineTimeVale" |
|||
size="small" |
|||
style="width: 380px" |
|||
value-format="yyyy-MM-dd HH:mm:ss" |
|||
type="datetimerange" |
|||
range-separator="-" |
|||
start-placeholder="开始日期" |
|||
end-placeholder="结束日期" |
|||
></el-date-picker> |
|||
</el-form-item> |
|||
<!-- </el-row> --> |
|||
<!-- <el-row> --> |
|||
<el-form-item label="接收日期"> |
|||
<el-date-picker |
|||
v-model="listQuery.ReceiveTimeVale" |
|||
size="small" |
|||
style="width: 380px" |
|||
value-format="yyyy-MM-dd HH:mm:ss" |
|||
type="datetimerange" |
|||
range-separator="-" |
|||
start-placeholder="开始日期" |
|||
end-placeholder="结束日期" |
|||
></el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item label="单据状态" prop="State"> |
|||
<el-checkbox-group v-model="listQuery.state" > |
|||
<el-checkbox v-for="item in billState" :key="item.id" :label="item.id"> |
|||
{{ item.name }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item style="margin: 0px"> |
|||
<el-button |
|||
type="primary" |
|||
icon="el-icon-search" |
|||
size="mini" |
|||
@click="handleFilter" |
|||
>搜索</el-button |
|||
> |
|||
<el-button |
|||
icon="el-icon-refresh" |
|||
size="mini" |
|||
@click="resetQuery('queryForm')" |
|||
>重置</el-button |
|||
> |
|||
<el-button |
|||
type="warning" |
|||
plain |
|||
icon="el-icon-download" |
|||
size="mini" |
|||
style="margin-left: 15px" |
|||
@click="handleDownload()" |
|||
>导出(Excel) |
|||
</el-button> |
|||
<el-button |
|||
type="primary" |
|||
size="mini" |
|||
style="margin-left: 15px" |
|||
@click="print()" |
|||
>打印发货排序单 |
|||
</el-button> |
|||
<el-button |
|||
type="primary" |
|||
size="mini" |
|||
style="margin-left: 15px" |
|||
@click="rePrint()" |
|||
>重新打印发货排序单 |
|||
</el-button> |
|||
<el-button |
|||
type="primary" |
|||
size="mini" |
|||
style="margin-left: 15px" |
|||
@click="makeUpPrint()" |
|||
>补打发货排序单 |
|||
</el-button> |
|||
</el-form-item> |
|||
<!-- </el-row> --> |
|||
</el-form> |
|||
</flexbox> |
|||
</div> |
|||
<div class="l-table"> |
|||
<!--表格渲染--> |
|||
<el-table |
|||
ref="multipleTable" |
|||
v-loading="listLoading" |
|||
element-loading-text="拼命加载中..." |
|||
element-loading-spinner="el-icon-loading" |
|||
class="cr-table" |
|||
:data="list" |
|||
:height="tableHeight" |
|||
:cell-style="cellStyle" |
|||
:header-cell-style="headerRowStyle" |
|||
size="small" |
|||
stripe |
|||
border |
|||
highlight-current-row |
|||
style="width: 100%" |
|||
@sort-change="sortChange" |
|||
@selection-change="handleSelectionChange" |
|||
@row-click="handleRowClick" |
|||
> |
|||
|
|||
<el-table-column |
|||
label="底盘号" |
|||
prop="vin " |
|||
sortable="custom" |
|||
align="center" |
|||
|
|||
width="180px" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<span class="link-type" @click="handleDrawerOpen(scope.row)">{{ |
|||
scope.row.vin |
|||
}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
v-for="(item, index) in getDefaultField" |
|||
:key="index" |
|||
:prop="item.prop" |
|||
:label="item.label" |
|||
:min-width="item.width" |
|||
:formatter="fieldFormatter" |
|||
sortable="custom" |
|||
show-overflow-tooltip |
|||
:gutter="0" |
|||
> |
|||
<template slot="header" slot-scope="scope"> |
|||
{{ scope.column.label }} |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
|
|||
</div> |
|||
|
|||
<div class="table-footer"> |
|||
<!-- 分页控件 style="margin-top: -25px;margin-bottom:-25px;float:right;"--> |
|||
<pagination |
|||
v-show="totalCount > 0" |
|||
:total="totalCount" |
|||
:page.sync="page" |
|||
:limit.sync="listQuery.MaxResultCount" |
|||
@pagination="getList" |
|||
/> |
|||
<!-- 抽屉控件 --> |
|||
<el-drawer |
|||
title="信息详细页" |
|||
size="75%" |
|||
direction="rtl" |
|||
:visible.sync="drawer" |
|||
:before-close="handleDrawerClose" |
|||
> |
|||
</el-drawer> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import Pagination from "@/components/Pagination"; |
|||
import permission from "@/directive/permission/index.js"; |
|||
import CRMTableHead from "../../components/CRMTableHead"; |
|||
import importExcel from "@/components/ImportExcel-vw"; |
|||
import Lockr from "lockr"; |
|||
import moment from "moment"; |
|||
import { downloadFile } from "@/utils/crmindex.js"; |
|||
|
|||
//组件计量单位 |
|||
const bomUnit = [ |
|||
{ key: 0, display_name: "PC" }, |
|||
{ key: 1, display_name: "TON" }, |
|||
{ key: 2, display_name: "Other" }, |
|||
]; |
|||
|
|||
|
|||
const projectTypeKeyValue = bomUnit.reduce((acc, cur) => { |
|||
acc[cur.key] = cur.display_name; |
|||
return acc; |
|||
}, {}); |
|||
|
|||
export default { |
|||
name: "M100Online", |
|||
components: { Pagination, CRMTableHead, importExcel }, |
|||
directives: { permission }, |
|||
filters: { |
|||
IsCustomerSignFilter(status) { |
|||
//翻译是否签字 |
|||
const statusMap = { |
|||
true: "是", |
|||
false: "否", |
|||
}; |
|||
return statusMap[status]; |
|||
}, |
|||
}, |
|||
data() { |
|||
const validVersion = (rule, value, callback) => { |
|||
let numberReg = /^\d{6}$/; |
|||
if (!numberReg.test(value)) { |
|||
callback(new Error("只能为6位数字!")); |
|||
} else { |
|||
callback(); |
|||
} |
|||
}; |
|||
return { |
|||
crmType: "M100Online", |
|||
rules: { |
|||
erpAssemblyName: [ |
|||
{ required: true, message: "必须输入!", trigger: "blur" }, |
|||
], |
|||
}, |
|||
billState:[ |
|||
{id:0,name:"已匹配"}, |
|||
{id:1,name:"已导出"} |
|||
], |
|||
valueSelect: "", |
|||
customerInfos: [], |
|||
dialogOptions: [], |
|||
versionValue: "", |
|||
searchContent: "", // 输入内容 |
|||
showExcelImport: false, |
|||
form: {}, |
|||
drawer: false, |
|||
list: null, |
|||
totalCount: 0, |
|||
listLoading: true, |
|||
customerInfo: { |
|||
bomId: "", |
|||
}, |
|||
// 高级搜索 |
|||
filterObj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {}; |
|||
}, |
|||
}, |
|||
listQuery: { |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
ErpAssemblyName: undefined, |
|||
ErpAssemblyCode: undefined, |
|||
carType:undefined, |
|||
OnlineTimeVale:undefined, |
|||
ReceiveTimeVale:undefined, |
|||
state:[], |
|||
|
|||
}, |
|||
listExportQuery: { |
|||
erpAssemblyCode: undefined, |
|||
erpAssemblyName: undefined, |
|||
}, |
|||
form:{ |
|||
details:[] |
|||
}, |
|||
page: 1, |
|||
// 显示搜索条件 |
|||
showSearch: true, |
|||
bomUnit, |
|||
multipleSelection: [], |
|||
drawer: false, |
|||
dialogFormVisible: false, |
|||
formTitle: "", |
|||
isEdit: false, |
|||
formLoading: false, |
|||
tableHeight: document.documentElement.clientHeight - 335, |
|||
detailTableHeight:250, |
|||
details:[], //修改子表数据源 |
|||
}; |
|||
}, |
|||
mounted() { |
|||
this.$nextTick(() => { |
|||
var offsetHei = document.documentElement.clientHeight; |
|||
//console.log(offsetHei); |
|||
let boxH = this.$refs.box.offsetHeight; |
|||
this.tableHeight = offsetHei - boxH - 57 - 79;//57为footer高度,79为页面上部标签高度 |
|||
//console.log(this.$refs.box.offsetHeight); |
|||
//console.log(this.tableHeight); |
|||
}); |
|||
}, |
|||
created() { |
|||
this.getList(); |
|||
}, |
|||
computed: { |
|||
getDefaultField() { |
|||
|
|||
var tempsTabs = []; |
|||
tempsTabs.push({ label: "流水号", prop: "serialNum", width: 100 }); |
|||
tempsTabs.push({ label: "大众顺序号", prop: "hostSN", width: 120 }); |
|||
tempsTabs.push({ |
|||
label: "KNR", |
|||
prop: "knr", |
|||
width: 120, |
|||
}); |
|||
// tempsTabs.push({ |
|||
// label: "底盘号", |
|||
// prop: "vin", |
|||
// width: 130, |
|||
// }); |
|||
tempsTabs.push({ |
|||
label: "KNR", |
|||
prop: "knr", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "M100上线时间", |
|||
prop: "m100OnlineTime", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "M100接收时间", |
|||
prop: "m100ReceiveTime", |
|||
width: 180, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "车型代码", |
|||
prop: "vehicleModelCode", |
|||
width: 120, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "版本", |
|||
prop: "version", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "R100上线时间", |
|||
prop: "r100OnlineTime", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "R100接收时间", |
|||
prop: "r100ReceiveTime", |
|||
width: 180, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "备注", |
|||
prop: "remark", |
|||
width: 120, |
|||
}); |
|||
return tempsTabs; |
|||
}, |
|||
}, |
|||
methods: { |
|||
//抽屉 |
|||
handleDrawerOpen(param) { |
|||
this.drawer = true; |
|||
var parentId = param.id; //主键id |
|||
this.customerInfos = [ |
|||
{ |
|||
ParentId: parentId, |
|||
}, |
|||
]; |
|||
}, |
|||
handleDrawerClose(done) { |
|||
done(); |
|||
}, |
|||
fetchData(id) { |
|||
//循环动态 |
|||
this.$axios |
|||
.gets("/api/newjit/assembly-cfg-erp/" + id) |
|||
.then((response) => { |
|||
this.form = response.item; |
|||
//this.details = response.item.details; |
|||
//console.log(this.details); |
|||
}); |
|||
}, |
|||
/** 导出功能 */ |
|||
handleDownload() { |
|||
this.listLoading = true; |
|||
this.listExportQuery.erpAssemblyCode = this.listQuery.ErpAssemblyCode; |
|||
this.listExportQuery.erpAssemblyName = this.listQuery.ErpAssemblyName; |
|||
console.log(JSON.stringify(this.listExportQuery)); |
|||
this.$axios |
|||
.posts("/api/newjit/assembly-cfg-erp/export", this.listExportQuery) |
|||
.then((res) => { |
|||
let filename = res.item; |
|||
this.$axios |
|||
.BolbGets("/api/newjit/exclude-part-cfg/download/" + filename) |
|||
.then((response) => { |
|||
if (filename.indexOf("_") != -1) { |
|||
let downName = |
|||
filename.slice(0, filename.lastIndexOf("_")) + |
|||
filename.slice(filename.lastIndexOf(".")); |
|||
downloadFile(response, downName); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} else { |
|||
downloadFile(response, filename); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} |
|||
this.listLoading = false; |
|||
}); |
|||
}); |
|||
this.listLoading = false; |
|||
}, |
|||
/** 重置按钮操作 */ |
|||
resetQuery(refName) { |
|||
//this.$refs[refName].resetFields(); |
|||
this.listQuery.ErpAssemblyName = ""; |
|||
this.listQuery.ErpAssemblyCode = ""; |
|||
this.handleQuery(); |
|||
}, |
|||
/** 搜索按钮操作 */ |
|||
handleQuery() { |
|||
this.listQuery.SkipCount = 1; |
|||
this.getList(); |
|||
}, |
|||
selectValue(params) { |
|||
//版本下拉选择 |
|||
this.versionValue = params.value; |
|||
this.getList(); |
|||
}, |
|||
|
|||
selectOptionsChange(item) { |
|||
this.getList(); |
|||
}, |
|||
importExcelData() { |
|||
//关闭导入窗体时调用 |
|||
this.showExcelImport = false; |
|||
//this.getList(); |
|||
}, |
|||
|
|||
/** 刷新列表 */ |
|||
handleHandle(data) { |
|||
if (data.type !== "edit") { |
|||
this.getList(); |
|||
} |
|||
}, |
|||
|
|||
handleAddDetails() { |
|||
if (this.form.details === undefined) { |
|||
this.form.details = []; |
|||
//console.log(679); |
|||
} |
|||
let obj = {}; |
|||
obj.partCode = ""; |
|||
obj.partName = ""; |
|||
obj.partNum = ""; |
|||
obj.isKey = false; |
|||
obj.description = ""; |
|||
|
|||
console.log(this.form.details); |
|||
this.form.details.push(obj); |
|||
//console.log(688); |
|||
}, |
|||
handleDeleteDetails(index){ |
|||
this.form.details.splice(index, 1); |
|||
//console.log(693); |
|||
}, |
|||
|
|||
/** 格式化字段 */ |
|||
fieldFormatter(row, column) { |
|||
if (column.property === "billStatus") { |
|||
return { 0: "未生效", 2: "已生效", 3: "已发布" }[row[column.property]]; |
|||
} |
|||
if (column.property == "onlineTime" || column.property == "receiveTime") { |
|||
var date = row[column.property]; |
|||
if (date == undefined) { |
|||
return ""; |
|||
} |
|||
return moment(date).format("YYYY-MM-DD HH:mm:ss"); |
|||
} |
|||
return row[column.property] || "--"; |
|||
}, |
|||
roleFilter(type) { |
|||
return projectTypeKeyValue[type]; |
|||
}, |
|||
getList() { |
|||
this.listLoading = true; |
|||
this.listQuery.SkipCount = (this.page - 1) * 10; |
|||
this.$axios |
|||
.gets("/api/newjit/assembly-cfg-erp/list", this.listQuery) |
|||
.then((response) => { |
|||
this.list = response.items; |
|||
this.totalCount = response.totalCount; |
|||
setTimeout(() => { |
|||
//大数据量加载时 |
|||
this.listLoading = false; |
|||
}, 500); |
|||
}) |
|||
.catch(() => { |
|||
this.listLoading = false; |
|||
}); |
|||
}, |
|||
|
|||
|
|||
getDetialList(partCode) { |
|||
this.listLoading = true; |
|||
console.log("详表条件:" + JSON.stringify(this.customerInfo.parentId)); |
|||
this.$axios |
|||
.gets("/api/newjit/assembly-cfg-erp/" + this.customerInfo.parentId) |
|||
.then((response) => { |
|||
console.log(partCode) |
|||
if(partCode !== "" && partCode !== undefined) |
|||
{ |
|||
//console.log(partCode) |
|||
this.list = response.item.details.filter(u => u.partCode === partCode); |
|||
} |
|||
else |
|||
{ |
|||
this.list = response.item.details; |
|||
} |
|||
//alert(JSON.stringify(response.Items)) |
|||
//this.totalCount = response.totalCount; |
|||
setTimeout(() => { |
|||
//大数据量加载时 |
|||
this.listLoading = false; |
|||
}, 500); |
|||
}) |
|||
.catch(() => { |
|||
this.listLoading = false; |
|||
}); |
|||
}, |
|||
|
|||
valueselectChange(){}, |
|||
handleImportSAP(){}, |
|||
|
|||
handleFilter() { |
|||
this.page = 1; |
|||
this.getList(); |
|||
}, |
|||
|
|||
sortChange(data) { |
|||
const { prop, order } = data; |
|||
if (!prop || !order) { |
|||
this.handleFilter(); |
|||
return; |
|||
} |
|||
this.listQuery.Sorting = prop + " " + order; |
|||
this.handleFilter(); |
|||
}, |
|||
handleSelectionChange(val) { |
|||
this.multipleSelection = val; |
|||
}, |
|||
/** 通过回调控制style */ |
|||
cellStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right" }; |
|||
} else { |
|||
return { textAlign: "left" }; |
|||
} |
|||
}, |
|||
/** 通过回调控制表头style */ |
|||
headerRowStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right", background: "#FAFAFA" }; |
|||
} else { |
|||
return { textAlign: "left", background: "#FAFAFA" }; |
|||
} |
|||
}, |
|||
handleRowClick(row, column, event) { |
|||
this.$refs.multipleTable.clearSelection(); |
|||
this.$refs.multipleTable.toggleRowSelection(row); |
|||
}, |
|||
print(){}, |
|||
rePrint(){}, |
|||
makeUpPrint(){}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
|
|||
<style lang="scss" scoped> |
|||
@import "../../../ux/styles/crmtable.scss"; |
|||
|
|||
// /*表格全选框去除空框*/ |
|||
// .el-table >>> .DisabledSelection .cell .el-checkbox__inner { |
|||
// display: none; |
|||
// position: relative; |
|||
// } |
|||
// /*表格全选框改为:选择*/ |
|||
// .el-table >>> .DisabledSelection .cell:before { |
|||
// content: "是否Key件"; |
|||
// position: absolute; |
|||
// left: 7px; |
|||
// } |
|||
.divider1{ |
|||
margin: 0 ; |
|||
} |
|||
.divider2{ |
|||
margin: 10px; |
|||
margin-bottom: 20px ; |
|||
width: 95%; |
|||
} |
|||
</style> |
|||
|
@ -0,0 +1,688 @@ |
|||
<!--总成模块信息管理页--> |
|||
<template> |
|||
<div class="cr-body-content"> |
|||
<div ref="box"> |
|||
<flexbox class="content-header" > |
|||
<el-form |
|||
:model="listQuery" |
|||
ref="queryForm" |
|||
v-show="showSearch" |
|||
:inline="true" |
|||
> |
|||
<!-- <el-row> --> |
|||
<el-form-item label="生产线:" prop="workLine"> |
|||
<el-select |
|||
v-model="listQuery.workLine" |
|||
clearable |
|||
placeholder="请选择" |
|||
size="medium" |
|||
style="margin-right: 15px" |
|||
@change="valueselectChange" |
|||
> |
|||
<el-option label="门板" value="R0003"></el-option> |
|||
<el-option label="二配" value="R0001"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="" prop="workLineCode"> |
|||
<el-select |
|||
v-model="listQuery.workLineCode" |
|||
clearable |
|||
placeholder="请选择" |
|||
size="medium" |
|||
style="margin-right: 15px" |
|||
@change="valueselectChange" |
|||
> |
|||
<el-option label="01-C8" value="01-C8"></el-option> |
|||
<el-option label="01-C9" value="01-C9"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="版本:" prop="Version"> |
|||
<el-input |
|||
v-model="listQuery.Version" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<!-- </el-row> --> |
|||
<!-- <el-row> --> |
|||
<el-form-item label="大众顺序号:" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="-" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="KNR:" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="-" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<!-- </el-row> --> |
|||
<!-- <el-row> --> |
|||
<el-form-item label="底盘号:" prop="ErpAssemblyName"> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="-" prop="ErpAssemblyName "> |
|||
<el-input |
|||
v-model="listQuery.ErpAssemblyName" |
|||
placeholder="" |
|||
clearable |
|||
size="small" |
|||
style="width: 240px" |
|||
@keyup.enter.native="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="上线日期"> |
|||
<el-date-picker |
|||
v-model="listQuery.OnlineTimeVale" |
|||
size="small" |
|||
style="width: 380px" |
|||
value-format="yyyy-MM-dd HH:mm:ss" |
|||
type="datetimerange" |
|||
range-separator="-" |
|||
start-placeholder="开始日期" |
|||
end-placeholder="结束日期" |
|||
></el-date-picker> |
|||
</el-form-item> |
|||
<!-- </el-row> --> |
|||
<!-- <el-row> --> |
|||
<el-form-item label="接收日期"> |
|||
<el-date-picker |
|||
v-model="listQuery.ReceiveTimeVale" |
|||
size="small" |
|||
style="width: 380px" |
|||
value-format="yyyy-MM-dd HH:mm:ss" |
|||
type="datetimerange" |
|||
range-separator="-" |
|||
start-placeholder="开始日期" |
|||
end-placeholder="结束日期" |
|||
></el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item label="单据状态" prop="State"> |
|||
<el-checkbox-group v-model="listQuery.state" > |
|||
<el-checkbox v-for="item in billState" :key="item.id" :label="item.id"> |
|||
{{ item.name }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item style="margin: 0px"> |
|||
<el-button |
|||
type="primary" |
|||
icon="el-icon-search" |
|||
size="mini" |
|||
@click="handleFilter" |
|||
>搜索</el-button |
|||
> |
|||
<el-button |
|||
icon="el-icon-refresh" |
|||
size="mini" |
|||
@click="resetQuery('queryForm')" |
|||
>重置</el-button |
|||
> |
|||
<el-button |
|||
type="warning" |
|||
plain |
|||
icon="el-icon-download" |
|||
size="mini" |
|||
style="margin-left: 15px" |
|||
@click="handleDownload()" |
|||
>导出(Excel) |
|||
</el-button> |
|||
<el-button |
|||
type="primary" |
|||
size="mini" |
|||
style="margin-left: 15px" |
|||
@click="SAPExport()" |
|||
>导出Excel(用于SAP导入) |
|||
</el-button> |
|||
</el-form-item> |
|||
<!-- </el-row> --> |
|||
</el-form> |
|||
</flexbox> |
|||
</div> |
|||
<div class="l-table"> |
|||
<!--表格渲染--> |
|||
<el-table |
|||
ref="multipleTable" |
|||
v-loading="listLoading" |
|||
element-loading-text="拼命加载中..." |
|||
element-loading-spinner="el-icon-loading" |
|||
class="cr-table" |
|||
:data="list" |
|||
:height="tableHeight" |
|||
:cell-style="cellStyle" |
|||
:header-cell-style="headerRowStyle" |
|||
size="small" |
|||
stripe |
|||
border |
|||
highlight-current-row |
|||
style="width: 100%" |
|||
@sort-change="sortChange" |
|||
@selection-change="handleSelectionChange" |
|||
@row-click="handleRowClick" |
|||
> |
|||
|
|||
<!-- <el-table-column |
|||
label="底盘号" |
|||
prop="vin " |
|||
sortable="custom" |
|||
align="center" |
|||
|
|||
width="180px" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<span class="link-type" @click="handleDrawerOpen(scope.row)">{{ |
|||
scope.row.vin |
|||
}}</span> |
|||
</template> |
|||
</el-table-column> --> |
|||
<el-table-column |
|||
v-for="(item, index) in getDefaultField" |
|||
:key="index" |
|||
:prop="item.prop" |
|||
:label="item.label" |
|||
:min-width="item.width" |
|||
:formatter="fieldFormatter" |
|||
sortable="custom" |
|||
show-overflow-tooltip |
|||
:gutter="0" |
|||
> |
|||
<template slot="header" slot-scope="scope"> |
|||
{{ scope.column.label }} |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
|
|||
</div> |
|||
|
|||
<div class="table-footer"> |
|||
<!-- 分页控件 style="margin-top: -25px;margin-bottom:-25px;float:right;"--> |
|||
<pagination |
|||
v-show="totalCount > 0" |
|||
:total="totalCount" |
|||
:page.sync="page" |
|||
:limit.sync="listQuery.MaxResultCount" |
|||
@pagination="getList" |
|||
/> |
|||
<!-- 抽屉控件 --> |
|||
<el-drawer |
|||
title="信息详细页" |
|||
size="75%" |
|||
direction="rtl" |
|||
:visible.sync="drawer" |
|||
:before-close="handleDrawerClose" |
|||
> |
|||
</el-drawer> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import Pagination from "@/components/Pagination"; |
|||
import permission from "@/directive/permission/index.js"; |
|||
import CRMTableHead from "../../components/CRMTableHead"; |
|||
import importExcel from "@/components/ImportExcel-vw"; |
|||
import Lockr from "lockr"; |
|||
import moment from "moment"; |
|||
import { downloadFile } from "@/utils/crmindex.js"; |
|||
|
|||
//组件计量单位 |
|||
const bomUnit = [ |
|||
{ key: 0, display_name: "PC" }, |
|||
{ key: 1, display_name: "TON" }, |
|||
{ key: 2, display_name: "Other" }, |
|||
]; |
|||
|
|||
|
|||
const projectTypeKeyValue = bomUnit.reduce((acc, cur) => { |
|||
acc[cur.key] = cur.display_name; |
|||
return acc; |
|||
}, {}); |
|||
|
|||
export default { |
|||
name: "M100Online", |
|||
components: { Pagination, CRMTableHead, importExcel }, |
|||
directives: { permission }, |
|||
filters: { |
|||
IsCustomerSignFilter(status) { |
|||
//翻译是否签字 |
|||
const statusMap = { |
|||
true: "是", |
|||
false: "否", |
|||
}; |
|||
return statusMap[status]; |
|||
}, |
|||
}, |
|||
data() { |
|||
const validVersion = (rule, value, callback) => { |
|||
let numberReg = /^\d{6}$/; |
|||
if (!numberReg.test(value)) { |
|||
callback(new Error("只能为6位数字!")); |
|||
} else { |
|||
callback(); |
|||
} |
|||
}; |
|||
return { |
|||
crmType: "M100Online", |
|||
rules: { |
|||
erpAssemblyName: [ |
|||
{ required: true, message: "必须输入!", trigger: "blur" }, |
|||
], |
|||
}, |
|||
billState:[ |
|||
{id:0,name:"已匹配"}, |
|||
{id:1,name:"已导出"} |
|||
], |
|||
valueSelect: "", |
|||
customerInfos: [], |
|||
dialogOptions: [], |
|||
versionValue: "", |
|||
searchContent: "", // 输入内容 |
|||
showExcelImport: false, |
|||
form: {}, |
|||
drawer: false, |
|||
list: null, |
|||
totalCount: 0, |
|||
listLoading: true, |
|||
customerInfo: { |
|||
bomId: "", |
|||
}, |
|||
// 高级搜索 |
|||
filterObj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {}; |
|||
}, |
|||
}, |
|||
listQuery: { |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
ErpAssemblyName: undefined, |
|||
ErpAssemblyCode: undefined, |
|||
carType:undefined, |
|||
OnlineTimeVale:undefined, |
|||
ReceiveTimeVale:undefined, |
|||
state:[], |
|||
|
|||
}, |
|||
listExportQuery: { |
|||
erpAssemblyCode: undefined, |
|||
erpAssemblyName: undefined, |
|||
}, |
|||
form:{ |
|||
details:[] |
|||
}, |
|||
page: 1, |
|||
// 显示搜索条件 |
|||
showSearch: true, |
|||
bomUnit, |
|||
multipleSelection: [], |
|||
drawer: false, |
|||
dialogFormVisible: false, |
|||
formTitle: "", |
|||
isEdit: false, |
|||
formLoading: false, |
|||
tableHeight: document.documentElement.clientHeight - 335, |
|||
detailTableHeight:250, |
|||
details:[], //修改子表数据源 |
|||
}; |
|||
}, |
|||
mounted() { |
|||
this.$nextTick(() => { |
|||
var offsetHei = document.documentElement.clientHeight; |
|||
//console.log(offsetHei); |
|||
let boxH = this.$refs.box.offsetHeight; |
|||
this.tableHeight = offsetHei - boxH - 57 - 79;//57为footer高度,79为页面上部标签高度 |
|||
//console.log(this.$refs.box.offsetHeight); |
|||
//console.log(this.tableHeight); |
|||
}); |
|||
}, |
|||
created() { |
|||
this.getList(); |
|||
}, |
|||
computed: { |
|||
getDefaultField() { |
|||
|
|||
var tempsTabs = []; |
|||
tempsTabs.push({ label: "大众顺序号", prop: "hostSN", width: 120 }); |
|||
tempsTabs.push({ |
|||
label: "KNR", |
|||
prop: "knr", |
|||
width: 120, |
|||
}); |
|||
// tempsTabs.push({ |
|||
// label: "底盘号", |
|||
// prop: "vin", |
|||
// width: 130, |
|||
// }); |
|||
tempsTabs.push({ |
|||
label: "KNR", |
|||
prop: "knr", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "单据状态", |
|||
prop: "billState", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "上线时间", |
|||
prop: "onlineTime", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "接收时间", |
|||
prop: "receiveTime", |
|||
width: 180, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "车型代码", |
|||
prop: "vehicleModelCode", |
|||
width: 120, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "版本", |
|||
prop: "version", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "总成编号", |
|||
prop: "erpAssemblyCode", |
|||
width: 150, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "总成名称", |
|||
prop: "erpAssemblyName", |
|||
width: 180, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "备注", |
|||
prop: "remark", |
|||
width: 120, |
|||
}); |
|||
return tempsTabs; |
|||
}, |
|||
}, |
|||
methods: { |
|||
//抽屉 |
|||
handleDrawerOpen(param) { |
|||
this.drawer = true; |
|||
var parentId = param.id; //主键id |
|||
this.customerInfos = [ |
|||
{ |
|||
ParentId: parentId, |
|||
}, |
|||
]; |
|||
}, |
|||
handleDrawerClose(done) { |
|||
done(); |
|||
}, |
|||
/** 导出功能 */ |
|||
handleDownload() { |
|||
this.listLoading = true; |
|||
this.listExportQuery.erpAssemblyCode = this.listQuery.ErpAssemblyCode; |
|||
this.listExportQuery.erpAssemblyName = this.listQuery.ErpAssemblyName; |
|||
console.log(JSON.stringify(this.listExportQuery)); |
|||
this.$axios |
|||
.posts("/api/newjit/assembly-cfg-erp/export", this.listExportQuery) |
|||
.then((res) => { |
|||
let filename = res.item; |
|||
this.$axios |
|||
.BolbGets("/api/newjit/exclude-part-cfg/download/" + filename) |
|||
.then((response) => { |
|||
if (filename.indexOf("_") != -1) { |
|||
let downName = |
|||
filename.slice(0, filename.lastIndexOf("_")) + |
|||
filename.slice(filename.lastIndexOf(".")); |
|||
downloadFile(response, downName); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} else { |
|||
downloadFile(response, filename); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} |
|||
this.listLoading = false; |
|||
}); |
|||
}); |
|||
this.listLoading = false; |
|||
}, |
|||
/** 重置按钮操作 */ |
|||
resetQuery(refName) { |
|||
//this.$refs[refName].resetFields(); |
|||
this.listQuery.ErpAssemblyName = ""; |
|||
this.listQuery.ErpAssemblyCode = ""; |
|||
this.handleQuery(); |
|||
}, |
|||
/** 搜索按钮操作 */ |
|||
handleQuery() { |
|||
this.listQuery.SkipCount = 1; |
|||
this.getList(); |
|||
}, |
|||
selectValue(params) { |
|||
//版本下拉选择 |
|||
this.versionValue = params.value; |
|||
this.getList(); |
|||
}, |
|||
|
|||
selectOptionsChange(item) { |
|||
this.getList(); |
|||
}, |
|||
importExcelData() { |
|||
//关闭导入窗体时调用 |
|||
this.showExcelImport = false; |
|||
//this.getList(); |
|||
}, |
|||
|
|||
/** 刷新列表 */ |
|||
handleHandle(data) { |
|||
if (data.type !== "edit") { |
|||
this.getList(); |
|||
} |
|||
}, |
|||
|
|||
handleAddDetails() { |
|||
if (this.form.details === undefined) { |
|||
this.form.details = []; |
|||
//console.log(679); |
|||
} |
|||
let obj = {}; |
|||
obj.partCode = ""; |
|||
obj.partName = ""; |
|||
obj.partNum = ""; |
|||
obj.isKey = false; |
|||
obj.description = ""; |
|||
|
|||
console.log(this.form.details); |
|||
this.form.details.push(obj); |
|||
//console.log(688); |
|||
}, |
|||
handleDeleteDetails(index){ |
|||
this.form.details.splice(index, 1); |
|||
//console.log(693); |
|||
}, |
|||
|
|||
/** 格式化字段 */ |
|||
fieldFormatter(row, column) { |
|||
if (column.property === "billStatus") { |
|||
return { 0: "未生效", 2: "已生效", 3: "已发布" }[row[column.property]]; |
|||
} |
|||
if (column.property == "onlineTime" || column.property == "receiveTime") { |
|||
var date = row[column.property]; |
|||
if (date == undefined) { |
|||
return ""; |
|||
} |
|||
return moment(date).format("YYYY-MM-DD HH:mm:ss"); |
|||
} |
|||
return row[column.property] || "--"; |
|||
}, |
|||
roleFilter(type) { |
|||
return projectTypeKeyValue[type]; |
|||
}, |
|||
getList() { |
|||
this.listLoading = true; |
|||
this.listQuery.SkipCount = (this.page - 1) * 10; |
|||
this.$axios |
|||
.gets("/api/newjit/assembly-cfg-erp/list", this.listQuery) |
|||
.then((response) => { |
|||
this.list = response.items; |
|||
this.totalCount = response.totalCount; |
|||
setTimeout(() => { |
|||
//大数据量加载时 |
|||
this.listLoading = false; |
|||
}, 500); |
|||
}) |
|||
.catch(() => { |
|||
this.listLoading = false; |
|||
}); |
|||
}, |
|||
|
|||
|
|||
getDetialList(partCode) { |
|||
this.listLoading = true; |
|||
console.log("详表条件:" + JSON.stringify(this.customerInfo.parentId)); |
|||
this.$axios |
|||
.gets("/api/newjit/assembly-cfg-erp/" + this.customerInfo.parentId) |
|||
.then((response) => { |
|||
console.log(partCode) |
|||
if(partCode !== "" && partCode !== undefined) |
|||
{ |
|||
//console.log(partCode) |
|||
this.list = response.item.details.filter(u => u.partCode === partCode); |
|||
} |
|||
else |
|||
{ |
|||
this.list = response.item.details; |
|||
} |
|||
//alert(JSON.stringify(response.Items)) |
|||
//this.totalCount = response.totalCount; |
|||
setTimeout(() => { |
|||
//大数据量加载时 |
|||
this.listLoading = false; |
|||
}, 500); |
|||
}) |
|||
.catch(() => { |
|||
this.listLoading = false; |
|||
}); |
|||
}, |
|||
|
|||
valueselectChange(){}, |
|||
handleImportSAP(){}, |
|||
|
|||
handleFilter() { |
|||
this.page = 1; |
|||
this.getList(); |
|||
}, |
|||
|
|||
sortChange(data) { |
|||
const { prop, order } = data; |
|||
if (!prop || !order) { |
|||
this.handleFilter(); |
|||
return; |
|||
} |
|||
this.listQuery.Sorting = prop + " " + order; |
|||
this.handleFilter(); |
|||
}, |
|||
handleSelectionChange(val) { |
|||
this.multipleSelection = val; |
|||
}, |
|||
/** 通过回调控制style */ |
|||
cellStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right" }; |
|||
} else { |
|||
return { textAlign: "left" }; |
|||
} |
|||
}, |
|||
/** 通过回调控制表头style */ |
|||
headerRowStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right", background: "#FAFAFA" }; |
|||
} else { |
|||
return { textAlign: "left", background: "#FAFAFA" }; |
|||
} |
|||
}, |
|||
handleRowClick(row, column, event) { |
|||
this.$refs.multipleTable.clearSelection(); |
|||
this.$refs.multipleTable.toggleRowSelection(row); |
|||
}, |
|||
SAPExport(){}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
|
|||
<style lang="scss" scoped> |
|||
@import "../../../ux/styles/crmtable.scss"; |
|||
|
|||
// /*表格全选框去除空框*/ |
|||
// .el-table >>> .DisabledSelection .cell .el-checkbox__inner { |
|||
// display: none; |
|||
// position: relative; |
|||
// } |
|||
// /*表格全选框改为:选择*/ |
|||
// .el-table >>> .DisabledSelection .cell:before { |
|||
// content: "是否Key件"; |
|||
// position: absolute; |
|||
// left: 7px; |
|||
// } |
|||
.divider1{ |
|||
margin: 0 ; |
|||
} |
|||
.divider2{ |
|||
margin: 10px; |
|||
margin-bottom: 20px ; |
|||
width: 95%; |
|||
} |
|||
</style> |
|||
|
@ -0,0 +1,952 @@ |
|||
<!--零件匹配关系页--> |
|||
<template> |
|||
<div class="cr-body-content"> |
|||
<div ref="box"> |
|||
<flexbox class="content-header"> |
|||
|
|||
<el-form |
|||
:model="listQuery" |
|||
ref="queryForm" |
|||
v-show="showSearch" |
|||
:inline="true" |
|||
> |
|||
<!-- <span>版本:</span> |
|||
|
|||
<XhJSSelect |
|||
:options="versionList" |
|||
style="width: 200px" |
|||
class="search-container" |
|||
@value-change="selectValue" |
|||
></XhJSSelect> --> |
|||
|
|||
|
|||
<el-form-item label="操作员登录名:" prop="userName"> |
|||
<el-input |
|||
v-model="listQuery.userName" |
|||
clearable |
|||
size="small" |
|||
placeholder="" |
|||
style="width: 200px" |
|||
class="search-container" |
|||
@keyup.enter.native="handleFilter" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="操作员真实名称:" prop="name"> |
|||
<el-input |
|||
v-model="listQuery.name" |
|||
clearable |
|||
size="small" |
|||
placeholder="" |
|||
style="width: 200px" |
|||
class="search-container" |
|||
@keyup.enter.native="handleFilter" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="部门:" prop="dep"> |
|||
<el-select |
|||
v-model="listQuery.dep" |
|||
clearable |
|||
placeholder="请选择" |
|||
size="medium" |
|||
style="margin-right: 15px" |
|||
@change="valueselectChange" |
|||
> |
|||
<el-option label="结算" value="R0003"></el-option> |
|||
<el-option label="二配" value="R0001"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="生产线:" prop="productLineCode"> |
|||
<el-select |
|||
v-model="listQuery.productLineCode" |
|||
clearable |
|||
placeholder="请选择" |
|||
size="medium" |
|||
style="margin-right: 15px" |
|||
@change="valueselectChange" |
|||
> |
|||
<el-option |
|||
v-for="item in PLList" |
|||
:key="item.productLineCode" |
|||
:label="item.productLineName" |
|||
:value="item.productLineCode"/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-input |
|||
v-model="searchContent" |
|||
clearable |
|||
size="small" |
|||
placeholder="按照结算件基本信息搜索..." |
|||
style="width: 200px" |
|||
class="search-container" |
|||
@keyup.enter.native="handleFilter" |
|||
/> --> |
|||
<el-form-item> |
|||
<el-button |
|||
size="mini" |
|||
type="primary" |
|||
icon="el-icon-search" |
|||
@click="handleFilter" |
|||
>搜索 |
|||
</el-button> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button |
|||
icon="el-icon-refresh" |
|||
size="mini" |
|||
@click="resetQuery('queryForm')" |
|||
>重置 |
|||
</el-button> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button |
|||
class="filter-item" |
|||
plain |
|||
size="mini" |
|||
type="warning" |
|||
icon="el-icon-bottom" |
|||
@click="handleDownload()" |
|||
>导出Excel |
|||
</el-button> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button |
|||
class="filter-item" |
|||
plain |
|||
size="mini" |
|||
type="primary" |
|||
@click="permissionConfig()" |
|||
>权限配置 |
|||
</el-button> |
|||
</el-form-item> |
|||
<!--表格头组件,filter查询--> |
|||
<!-- <c-r-m-table-head |
|||
ref="crmTableHead" |
|||
:crm-type="crmType" |
|||
@handle="handleHandle" |
|||
@filter="handleFilters" |
|||
> |
|||
</c-r-m-table-head> --> |
|||
</el-form> |
|||
</flexbox> |
|||
</div> |
|||
<!--表格渲染--> |
|||
<el-row> |
|||
<!--主表--> |
|||
<el-col :span="14"> |
|||
<el-table |
|||
ref="multipleTable" |
|||
v-loading.fullscreen.lock="listLoading" |
|||
element-loading-text="拼命加载中..." |
|||
element-loading-spinner="el-icon-loading" |
|||
class="cr-table" |
|||
:data="list" |
|||
:height="tableHeight" |
|||
:cell-style="cellStyle" |
|||
:header-cell-style="headerRowStyle" |
|||
size="small" |
|||
stripe |
|||
border |
|||
highlight-current-row |
|||
style="width: 100%" |
|||
@sort-change="sortChange" |
|||
@selection-change="handleSelectionChange" |
|||
@row-click="handleRowClick" |
|||
> |
|||
<!-- <el-table-column type="selection" width="44px"></el-table-column> --> |
|||
<el-table-column |
|||
type="index" label="序号" |
|||
:index="1"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
v-for="(item, index) in getDefaultField" |
|||
:key="index" |
|||
:prop="item.prop" |
|||
:label="item.label" |
|||
:min-width="item.width" |
|||
:formatter="fieldFormatter" |
|||
sortable="custom" |
|||
show-overflow-tooltip |
|||
:gutter="0" |
|||
> |
|||
<template slot="header" slot-scope="scope"> |
|||
{{ scope.column.label }} |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
</el-col> |
|||
<!--子表--> |
|||
<el-col :span="10"> |
|||
<el-table |
|||
ref="detailTable" |
|||
v-loading.fullscreen.lock="listDetailLoading" |
|||
element-loading-text="拼命加载中..." |
|||
element-loading-spinner="el-icon-loading" |
|||
class="cr-table" |
|||
:data="detaillist" |
|||
:height="tableHeight" |
|||
:cell-style="cellDetailStyle" |
|||
:header-cell-style="headerDetailRowStyle" |
|||
size="small" |
|||
stripe |
|||
border |
|||
highlight-current-row |
|||
style="width: 100%" |
|||
@sort-change="sortDetailChange" |
|||
@selection-change="handleDetailSelectionChange" |
|||
@row-click="handleDetailRowClick" |
|||
> |
|||
<!-- <el-table-column type="selection" width="44px"></el-table-column> --> |
|||
<!-- <el-table-column |
|||
label="版本" |
|||
prop="version" |
|||
sortable="custom" |
|||
align="center" |
|||
width="100px" |
|||
>fixed 默认固定在左边 |
|||
<template slot-scope="scope"> |
|||
<el-tooltip :content="scope.row.version" placement="top"> |
|||
<span class="link-type">{{ scope.row.version }}</span> |
|||
</el-tooltip> |
|||
</template> |
|||
</el-table-column> --> |
|||
<el-table-column |
|||
type="index" label="序号" |
|||
:index="1"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
v-for="(item, index) in getChildDefaultField" |
|||
:key="index" |
|||
:prop="item.prop" |
|||
:label="item.label" |
|||
:min-width="item.width" |
|||
:formatter="fieldFormatter" |
|||
sortable="custom" |
|||
show-overflow-tooltip |
|||
:gutter="0" |
|||
> |
|||
<template slot="header" slot-scope="scope"> |
|||
{{ scope.column.label }} |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
</el-col> |
|||
</el-row> |
|||
<!--表单渲染--> |
|||
<el-dialog |
|||
:visible.sync="dialogFormVisible" |
|||
:close-on-click-modal="false" |
|||
:title="formTitle" |
|||
width="700px" |
|||
> |
|||
<el-form |
|||
ref="form" |
|||
:inline="true" |
|||
:model="form" |
|||
:rules="rules" |
|||
size="small" |
|||
label-width="120px" |
|||
> |
|||
<el-row> |
|||
<el-col :span="4"> |
|||
<el-form-item label="操作员" required /> |
|||
</el-col> |
|||
<el-col :span="20"> |
|||
<el-input |
|||
style="width: 400px" |
|||
v-model="form.userName" |
|||
:disabled="isEdit" |
|||
/> |
|||
</el-col> |
|||
</el-row> |
|||
|
|||
|
|||
<el-row> |
|||
<el-transfer |
|||
v-model="form.worklines" |
|||
:titles="['可操作的生产线', '全部生产线']" |
|||
filterable |
|||
:data="UsePLList"> |
|||
</el-transfer> |
|||
</el-row> |
|||
</el-form> |
|||
|
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button type="text" @click="dialogFormVisible = false" |
|||
>取消</el-button |
|||
> |
|||
<el-button v-loading="formLoading" type="primary" @click="save" |
|||
>确认</el-button |
|||
> |
|||
</div> |
|||
</el-dialog> |
|||
<div class="table-footer"> |
|||
<!-- 分页控件 style="margin-top: -25px;margin-bottom:-25px;float:right;"--> |
|||
<pagination |
|||
v-show="totalCount > 0" |
|||
:total="totalCount" |
|||
:page.sync="page" |
|||
:limit.sync="listQuery.MaxResultCount" |
|||
@pagination="getList" |
|||
/> |
|||
<!-- 导入Excel组件 --> |
|||
<importExcel |
|||
ref="importexcel" |
|||
:show="showExcelImport" |
|||
:crmType="crmType" |
|||
@close="importExcelData" |
|||
/> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination |
|||
import permission from "@/directive/permission/index.js"; |
|||
import importExcel from "@/components/ImportExcel-invoice"; |
|||
import CRMTableHead from "../../components/CRMTableHead"; |
|||
import moment from "moment"; |
|||
import Lockr from "lockr"; |
|||
import { downloadFile } from "@/utils/crmindex.js"; |
|||
import XhJSSelect from "@/components/CreateCom/Xh-JS-Select-Label.vue"; |
|||
import { filter } from 'jszip/lib/object'; |
|||
|
|||
export default { |
|||
name: "CustomerPartCfg", |
|||
components: { Pagination, CRMTableHead, importExcel, XhJSSelect }, |
|||
directives: { permission }, |
|||
filters: { |
|||
IsCustomerSignFilter(status) { |
|||
//翻译是否签字 |
|||
const statusMap = { |
|||
true: "是", |
|||
false: "否", |
|||
}; |
|||
return statusMap[status]; |
|||
}, |
|||
}, |
|||
props: { |
|||
customerInfos: { |
|||
type: Array, |
|||
default: () => { |
|||
return []; |
|||
}, |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
crmType: "customerPartCfg", |
|||
versionValue: "", |
|||
//valueSelect: "R0003", |
|||
versionList: [], //版本列表 |
|||
rules: { |
|||
//前端定义的规则,后端也有验证 |
|||
erpMaterialCode: [ |
|||
{ required: true, message: "必须输入!", trigger: "blur" }, |
|||
], |
|||
}, |
|||
searchContent: "", // 输入内容 |
|||
customerInfo: { |
|||
settleAccountId: "", |
|||
}, |
|||
form: { |
|||
worklines:[] |
|||
}, |
|||
list: null, |
|||
totalCount: 0, |
|||
listLoading: true, |
|||
listDetailLoading: false, |
|||
formLoading: false, |
|||
// 高级搜索 |
|||
filterObj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {}; |
|||
}, |
|||
}, |
|||
listVersionQuery: { |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
}, |
|||
listQuery: { |
|||
Filters: [ |
|||
{ |
|||
logic: 0, |
|||
column: "Enabled", |
|||
action: 0, |
|||
value: "true", |
|||
}, //默认查询可用的 |
|||
], |
|||
//OrgID:"", |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
version: "", |
|||
customerCode: "", |
|||
//userId: "00000000-0000-0000-0000-000000000000", |
|||
userName:"",//用户名称 |
|||
name:"",//真实姓名 |
|||
productLineCode:"",//生产线 |
|||
}, |
|||
listExportQuery: { |
|||
Filters: [ |
|||
{ |
|||
logic: 0, |
|||
column: "Enabled", |
|||
action: 0, |
|||
value: "true", |
|||
}, //默认查询可用的 |
|||
], |
|||
//OrgID:"", |
|||
SkipCount: 0, |
|||
MaxResultCount: 15, |
|||
version: "", |
|||
fileType: 0, |
|||
userId: "", |
|||
}, |
|||
listPLQuery:{ |
|||
BillType: 1, |
|||
//UserId: "00000000-0000-0000-0000-000000000000", |
|||
}, |
|||
saveQuery:{ |
|||
userId: 1, |
|||
productLineIdList:[], |
|||
}, |
|||
showSearch: true, |
|||
page: 1, |
|||
multipleSelection: [], |
|||
formTitle: "人员产线权限变更", |
|||
drawer: false, |
|||
showExcelImport: false, |
|||
tableHeight: document.documentElement.clientHeight - 260, |
|||
isEdit: false, |
|||
sortState:false, //标记刷新是否是排序调用 |
|||
detaillist:[], |
|||
PLList:[], |
|||
UsePLList : [], |
|||
|
|||
dialogFormVisible:false,//窗口显隐 |
|||
|
|||
}; |
|||
}, |
|||
mounted() { |
|||
this.$nextTick(() => { |
|||
var offsetHei = document.documentElement.clientHeight; |
|||
//console.log(offsetHei); |
|||
let boxH = this.$refs.box.offsetHeight; |
|||
this.tableHeight = offsetHei - boxH - 57 - 79;//57为footer高度,79为页面上部标签高度 |
|||
//console.log(this.$refs.box.offsetHeight); |
|||
//console.log(this.tableHeight); |
|||
}); |
|||
}, |
|||
created() { |
|||
this.getList(); |
|||
this.getProductLine(); |
|||
}, |
|||
computed: { |
|||
/** 列表字段 */ |
|||
getDefaultField() { |
|||
var tempsTabs = []; |
|||
|
|||
// tempsTabs.push({ |
|||
// label: "序号", |
|||
// prop: "seq", |
|||
// width: 50, |
|||
// }); |
|||
tempsTabs.push({ |
|||
label: "操作员登录名", |
|||
prop: "userName", |
|||
width: 140, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "操作员真实名称", |
|||
prop: "name", |
|||
width: 140 |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "部门", |
|||
prop: "dep", |
|||
width: 120, |
|||
}); |
|||
return tempsTabs; |
|||
}, |
|||
/** 列表字段 */ |
|||
getChildDefaultField() { |
|||
var tempsTabs = []; |
|||
|
|||
tempsTabs.push({ |
|||
label: "序号", |
|||
prop: "seq", |
|||
width: 50, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "生产线编码", |
|||
prop: "workLineCode", |
|||
width: 100, |
|||
}); |
|||
tempsTabs.push({ |
|||
label: "生产线名称", |
|||
prop: "workLineName", |
|||
width: 170 |
|||
}); |
|||
return tempsTabs; |
|||
}, |
|||
}, |
|||
methods: { |
|||
selectValue(params) { |
|||
//版本下拉选择 |
|||
this.versionValue = params.value; |
|||
this.getList(); |
|||
}, |
|||
valueselectChange(data) { |
|||
//alert(data); |
|||
//版本下拉选择 |
|||
this.valueSelect = data; |
|||
this.getList(); |
|||
}, |
|||
handleTypeDrop(command, params = {}) { |
|||
if (command == "updateFis") { |
|||
this.listLoading = true; |
|||
//this.listQuery.SkipCount = (this.page - 1) * 10000; |
|||
this.$axios |
|||
.posts("/api/settleaccount/SettlementPart/updateFis") |
|||
.then((res) => { |
|||
if (res == true) { |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "FIS数据-更新成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} else { |
|||
this.$message({ |
|||
type: "warning", |
|||
message: "FIS数据-更新失败!", |
|||
}); |
|||
} |
|||
this.listLoading = false; |
|||
}); |
|||
} else if (command == "enter") { |
|||
} |
|||
}, |
|||
selectOptionsChange(item) { |
|||
this.getList(); |
|||
}, |
|||
getVersionInfo() { |
|||
//取版本列表信息 |
|||
//this.listLoading = true; |
|||
this.listVersionQuery.SkipCount = (this.page - 1) * 1000; |
|||
this.$axios |
|||
.posts( |
|||
"/api/settleaccount/SettlementPart/versionlist", |
|||
this.listVersionQuery |
|||
) |
|||
.then((response) => { |
|||
this.versionList = []; |
|||
response.items.forEach((element) => { |
|||
let options = {}; |
|||
options.value = element.id; |
|||
options.label = element.version; |
|||
this.versionList.push(options); |
|||
}); |
|||
const res = new Map() |
|||
this.versionList = this.versionList.filter((item) => !res.has(item.label) && res.set(item.label, 1)) |
|||
if (JSON.stringify(this.versionList) != "[]") { |
|||
//因版本下拉有默认值,所以详表要自动绑定子表数据 |
|||
this.versionValue = this.versionList[0].label; |
|||
this.getList(); |
|||
} |
|||
}) |
|||
.catch(() => { |
|||
//this.listLoading = false; |
|||
}); |
|||
}, |
|||
/** 刷新列表 */ |
|||
handleHandle(data) { |
|||
if (data.type !== "edit") { |
|||
this.getList(); |
|||
} |
|||
}, |
|||
/** 格式化字段 */ |
|||
fieldFormatter(row, column) { |
|||
/* if (column.property === "state") { |
|||
return { 0: "其他", 2: "已结" }[row[column.property]]; |
|||
} |
|||
if (column.property == "accountDate" || column.property == "date") { |
|||
var date = row[column.property]; |
|||
if (date == undefined) { |
|||
return ""; |
|||
} |
|||
//return moment(date).format("YYYY-MM-DD HH:mm:ss"); |
|||
return moment(date).format("YYYY-MM-DD"); |
|||
} */ |
|||
if(column.property === 'customerCode') |
|||
{ |
|||
if(row[column.property] === 'R0001') |
|||
{ |
|||
var vname = '二配'; |
|||
return vname; |
|||
} |
|||
else if(row[column.property] === 'R0003') |
|||
{ |
|||
var vname = '结算'; |
|||
return vname; |
|||
} |
|||
else |
|||
{ |
|||
return row[column.property]; |
|||
} |
|||
} |
|||
return row[column.property] || "--"; |
|||
}, |
|||
importExcelData() { |
|||
//this.getVersionInfo(); |
|||
this.listLoading = false; |
|||
//关闭导入窗体时调用 |
|||
this.showExcelImport = false; |
|||
}, |
|||
//导出功能 |
|||
async handleDownload() { |
|||
this.listLoading = true; |
|||
// if (this.versionValue === "") { |
|||
// this.$message.error("必需选择版本!"); |
|||
// this.listLoading = false; |
|||
// return; |
|||
// } |
|||
// if (this.versionValue != "") { |
|||
// this.listQuery.version = this.versionValue; |
|||
// } |
|||
console.log("发票导出:" + JSON.stringify(this.listQuery)); |
|||
this.$axios |
|||
.posts( |
|||
"/api/newjit/product-line-authority/export", |
|||
this.listQuery |
|||
) |
|||
.then((res) => { |
|||
let filename = res.item; |
|||
this.$axios |
|||
.BolbGets("/api/newjit/exclude-part-cfg/download/" + filename) |
|||
.then((response) => { |
|||
if (filename.indexOf("_") != -1) { |
|||
let downName = |
|||
filename.slice(0, filename.lastIndexOf("_")) + |
|||
filename.slice(filename.lastIndexOf(".")); |
|||
downloadFile(response, downName); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} else { |
|||
downloadFile(response, filename); |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据-导出成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} |
|||
this.listLoading = false; |
|||
}); |
|||
}); |
|||
}, |
|||
getList() { |
|||
this.listLoading = true; |
|||
this.listQuery.SkipCount = (this.page - 1) * 10; |
|||
console.log("列表查询条件:" + JSON.stringify(this.listQuery)); |
|||
this.$axios |
|||
.gets( |
|||
"/api/newjit/product-line-authority/list", |
|||
this.listQuery |
|||
) |
|||
.then((response) => { |
|||
this.list = response.item; |
|||
this.totalCount = response.item.length; |
|||
setTimeout(() => { |
|||
//大数据量加载时 |
|||
this.listLoading = false; |
|||
}, 500); |
|||
}) |
|||
.catch(() => { |
|||
this.listLoading = false; |
|||
}); |
|||
}, |
|||
fetchData(id) { |
|||
//循环动态 |
|||
this.$axios |
|||
.gets("/api/settleaccount/SettlementPart/" + id) |
|||
.then((response) => { |
|||
this.form = response; |
|||
}); |
|||
}, |
|||
/** 筛选操作 */ |
|||
handleFilter() { |
|||
this.page = 1; |
|||
//#region |
|||
/* |
|||
this.listQuery.Filters = []; |
|||
if (this.partCode != "") { |
|||
var column = "partCode"; |
|||
let filter = { |
|||
logic: 0, |
|||
column: column, |
|||
action: 0, |
|||
value: this.partCode, |
|||
}; |
|||
this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partCode") |
|||
this.listQuery.Filters.push(filter); |
|||
} |
|||
|
|||
if (this.partName != "") { |
|||
var column = "partName"; |
|||
let filter = { |
|||
logic: 0, |
|||
column: column, |
|||
action: 0, |
|||
value: this.partName, |
|||
}; |
|||
this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partName") |
|||
this.listQuery.Filters.push(filter); |
|||
} |
|||
|
|||
if (this.partType != "") { |
|||
var column = "partType"; |
|||
let filter = { |
|||
logic: 0, |
|||
column: column, |
|||
action: 0, |
|||
value: this.partType, |
|||
}; |
|||
this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partType") |
|||
this.listQuery.Filters.push(filter); |
|||
} |
|||
|
|||
if (this.partChildType != "") { |
|||
var column = "partChildType"; |
|||
let filter = { |
|||
logic: 0, |
|||
column: column, |
|||
action: 0, |
|||
value: this.partChildType, |
|||
}; |
|||
this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partChildType") |
|||
this.listQuery.Filters.push(filter); |
|||
} |
|||
*/ |
|||
//#endregion |
|||
this.getList(); |
|||
}, |
|||
/** 多项筛选操作 */ |
|||
/** 筛选操作 */ |
|||
handleFilters(data) { |
|||
if (data === null) { |
|||
this.listQuery.Filters = []; |
|||
this.getList(); //查询所有 |
|||
} else { |
|||
console.log(data) |
|||
this.filterObj = data; |
|||
console.log("筛选" + JSON.stringify(data)); |
|||
var offsetHei = document.documentElement.clientHeight; |
|||
var removeHeight = Object.keys(this.filterObj).length > 0 ? 310 : 240; |
|||
this.tableHeight = offsetHei - removeHeight; |
|||
this.currentPage = 1; |
|||
let Filter = []; |
|||
data.forEach((item) => { |
|||
let filter = {}; |
|||
if (item.formType === "datetime" || item.formType === "datetime") { |
|||
//日期类型的过滤条件是 (datetime >= a and datetime <=b) |
|||
filter["Column"] = item.fieldName; |
|||
filter["Logic"] = 0; |
|||
filter["Value"] = item.value[0]; |
|||
filter["Action"] = item.action; |
|||
Filter.push(filter); |
|||
|
|||
if (item.value[1] != null) { |
|||
filter["Value"] = item.value[1]; |
|||
filter["Action"] = 5; |
|||
Filter.push(filter); |
|||
} |
|||
} else { |
|||
filter["Column"] = item.fieldName; |
|||
filter["Value"] = item.value; |
|||
filter["Logic"] = 0; |
|||
filter["Action"] = item.action; |
|||
Filter.push(filter); |
|||
} |
|||
}); |
|||
console.log("筛选条件" + JSON.stringify(Filter)); |
|||
this.listQuery.Filters = Filter; |
|||
this.getList(); |
|||
} |
|||
}, |
|||
/** 重置按钮操作 */ |
|||
resetQuery(refName) { |
|||
this.listQuery.userName = ""; |
|||
this.listQuery.name = ""; |
|||
this.listQuery.dep = ""; |
|||
this.listQuery.productLineCode = ""; |
|||
//this.$refs[refName].resetFields(); |
|||
this.handleFilter(); |
|||
this.getProductLine(); |
|||
}, |
|||
sortChange(data) { |
|||
const { prop, order } = data; |
|||
if (!prop || !order) { |
|||
this.handleFilter(); |
|||
return; |
|||
} |
|||
this.listQuery.Sorting = prop + " " + order; |
|||
console.log(this.listQuery.Sorting); |
|||
if(this.listQuery.Filters.length>0 && this.listQuery.Filters[0].column === "Enabled") |
|||
{ |
|||
this.sortState = false; |
|||
} |
|||
else |
|||
{ |
|||
this.sortState = true; |
|||
} |
|||
this.handleFilter(); |
|||
}, |
|||
handleSelectionChange(val) { |
|||
this.multipleSelection = val; |
|||
}, |
|||
/** 通过回调控制style */ |
|||
cellStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right" }; |
|||
} else { |
|||
return { textAlign: "left" }; |
|||
} |
|||
}, |
|||
/** 通过回调控制表头style */ |
|||
headerRowStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right", background: "#FAFAFA" }; |
|||
} else { |
|||
return { textAlign: "left", background: "#FAFAFA" }; |
|||
} |
|||
}, |
|||
handleRowClick(row, column, event) { |
|||
this.$refs.multipleTable.clearSelection(); |
|||
this.$refs.multipleTable.toggleRowSelection(row); |
|||
this.detaillist = row.productLineList; |
|||
//console.log(this.detaillist) |
|||
}, |
|||
/** 通过回调控制style */ |
|||
cellDetailStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right" }; |
|||
} else { |
|||
return { textAlign: "left" }; |
|||
} |
|||
}, |
|||
/** 通过回调控制表头style */ |
|||
headerDetailRowStyle({ row, column, rowIndex, columnIndex }) { |
|||
if (column.property === "qty") { |
|||
return { textAlign: "right", background: "#FAFAFA" }; |
|||
} else { |
|||
return { textAlign: "left", background: "#FAFAFA" }; |
|||
} |
|||
}, |
|||
handleDetailRowClick(row, column, event) { |
|||
this.$refs.detailTable.clearSelection(); |
|||
this.$refs.detailTable.toggleRowSelection(row); |
|||
}, |
|||
handleDetailSelectionChange(){}, |
|||
sortDetailChange(){}, |
|||
getProductLine() |
|||
{ |
|||
this.$axios |
|||
.gets( |
|||
"/api/newjit/product-line/list",this.listPLQuery |
|||
) |
|||
.then((response) => { |
|||
console.log(response); |
|||
this.PLList = response.item; |
|||
//console.log() |
|||
}) |
|||
.catch(() => { |
|||
}); |
|||
}, |
|||
|
|||
//权限配置 |
|||
permissionConfig() |
|||
{ |
|||
if(this.multipleSelection.length != 1) |
|||
{ |
|||
this.$message({ |
|||
message: "必须选择单行", |
|||
type: "warning", |
|||
}); |
|||
return; |
|||
} |
|||
this.UsePLList = []; |
|||
this.dialogFormVisible = true; |
|||
this.form.worklines = []; |
|||
var templist = this.PLList; |
|||
this.multipleSelection[0].productLineList.forEach(element => { |
|||
templist = this.templist.filter(u => u.productLineCode !== element.productLineCode); |
|||
|
|||
}); |
|||
templist.forEach(element => { |
|||
this.form.worklines.push( |
|||
parseInt(element.productLineCode)); |
|||
}); |
|||
//console.log(this.form.worklines) |
|||
this.PLList.forEach(element => { |
|||
this.UsePLList.push( |
|||
{ |
|||
key:parseInt(element.productLineCode), |
|||
label:element.productLineName, |
|||
id:"", |
|||
disabled:false, |
|||
} |
|||
); |
|||
}); |
|||
this.form.userName = this.multipleSelection[0].userName; |
|||
}, |
|||
|
|||
//窗口确认 |
|||
save() |
|||
{ |
|||
console.log(this.form.worklines); |
|||
console.log(this.UsePLList); |
|||
var templist = this.UsePLList; |
|||
this.form.worklines.forEach(element => { |
|||
templist = templist.filter(u => u.key !== element); |
|||
}); |
|||
console.log(918); |
|||
console.log(templist); |
|||
|
|||
this.$axios |
|||
.gets( |
|||
"/api/newjit/product-line-authority/do-authority",this.listPLQuery |
|||
) |
|||
.then((response) => { |
|||
console.log(response); |
|||
this.PLList = response.item; |
|||
//console.log() |
|||
}) |
|||
.catch(() => { |
|||
}); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
|
|||
<style lang="scss" scoped> |
|||
@import "../../styles/crmtable.scss"; |
|||
</style> |
|||
<style lang="scss"> |
|||
.el-table .cell.el-tooltip { |
|||
white-space: pre-wrap; |
|||
} |
|||
</style> |
|||
|
|||
|
File diff suppressed because it is too large
@ -0,0 +1,337 @@ |
|||
<template> |
|||
<div style="position: relative;"> |
|||
<flexbox class="t-section"> |
|||
<img |
|||
:src="crmIcon" |
|||
class="t-img" > |
|||
<div class="t-name">{{ name }}</div> |
|||
<el-button |
|||
class="head-handle-button" |
|||
type="primary" |
|||
@click.native="handleTypeClick('edit')">编辑</el-button> |
|||
<!-- <img--> |
|||
<!-- class="t-close"--> |
|||
<!-- src="@/assets/img/task_close.png"--> |
|||
<!-- @click="hideView" >--> |
|||
</flexbox> |
|||
<flexbox |
|||
class="h-section" |
|||
align="stretch"> |
|||
<flexbox-item |
|||
v-for="(item, index) in headDetails" |
|||
:key="index" |
|||
class="h-item" |
|||
span="200"> |
|||
<div class="h-title">{{ item.name }}</div> |
|||
<div class="h-value text-one-line">{{ item.value}}</div> |
|||
</flexbox-item> |
|||
</flexbox> |
|||
<slot/> |
|||
</div> |
|||
</template> |
|||
<script type="text/javascript"> |
|||
import tableFields from "../../../../static/tableField"; |
|||
|
|||
export default { |
|||
name: 'CRMDetailHead', |
|||
components: { |
|||
// TransferHandle, |
|||
// AllocHandle, |
|||
// DealStatusHandle |
|||
}, |
|||
props: { |
|||
/** 模块ID */ |
|||
id: [String, Number], |
|||
/** 没有值就是全部类型 有值就是当个类型 */ |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
// 辅助 使用 |
|||
isSeas: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
/** 详细信息 */ |
|||
detail: { |
|||
type: Object, |
|||
default: () => { |
|||
return {} |
|||
} |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
moreTypes: [], // 更多操作 |
|||
fieldInfoList: [], |
|||
headDetails: { |
|||
type: Array, |
|||
default: () => { |
|||
return [] |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
computed: { |
|||
// ...mapGetters(['crm', 'CRMConfig']), |
|||
crmIcon() { |
|||
if (this.crmType === 'transaction') { |
|||
return require('@/assets/img/customer_detail.png') |
|||
} else if (this.crmType === 'leads') { |
|||
return require('@/assets/img/clue_detail.png') |
|||
} else if (this.crmType === 'strategy') { |
|||
return require('@/assets/img/business_detail.png') |
|||
} else if (this.crmType === 'rule') { |
|||
return require('@/assets/img/contacts_detail.png') |
|||
} else if (this.crmType === 'customer') { |
|||
return require('@/assets/img/contract_detail.png') |
|||
} else if (this.crmType === 'slgItem') { |
|||
return require('@/assets/img/money_detail.png') |
|||
} else if (this.crmType === 'dicts') { |
|||
return require('@/assets/img/product_detail.png') |
|||
} else if (this.crmType === 'bom') { |
|||
return require('@/assets/img/product_detail.png') |
|||
} else if (this.crmType === 'uomGroup') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'uom') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'area') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'areaItem') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'currency') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'currencyExchange') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'customerBom') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'customerItem') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'eqptType') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'eqptTypeItem') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'item') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'itemTransTypeInventoryRoute') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'itemTransTypeOpStrategy') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'loc') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'machine') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'param') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'port') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'prodLine') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'prodLineItem') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'project') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'shift') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'slg') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'supplier') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'supplierItem') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'team') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'uomConversion') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'wlg') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'wlgItem') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'workCalendar') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'workCenter') { |
|||
return require('@/assets/img/product_detail.png') |
|||
} else if (this.crmType === 'inventoryRoute') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'inventoryRouteDetail') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'purchasePriceDetail') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'purchasePriceSheet') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'route') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'routeDetail') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'salePriceDetail') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'salePriceSheet') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'stdCostPriceDetail') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else if (this.crmType === 'stdCostPriceSheet') { |
|||
return require('@/assets/img/product_detail.png') |
|||
}else { |
|||
return require('@/assets/img/product_detail.png') |
|||
} |
|||
return '' |
|||
}, |
|||
name() { |
|||
return this.detail.name |
|||
}, |
|||
showEdit() { |
|||
return this.crm[this.crmType].update |
|||
}, |
|||
}, |
|||
watch: { |
|||
detail:function(val) |
|||
{ |
|||
this. GetBaseInfoValue(val); |
|||
} |
|||
}, |
|||
mounted() { |
|||
//this.moreTypes = this.getSelectionHandleItemsInfo() |
|||
}, |
|||
methods: { |
|||
GetBaseInfoValue(res) |
|||
{ |
|||
this.headDetails=[]; |
|||
this.list=[] |
|||
let filedList = tableFields[this.crmType].data; |
|||
let resKeys= Object.keys(res); |
|||
filedList.map((item) => { |
|||
let key= resKeys.find(r=>{return r == item.fieldName && r!='Description'}); //不显示描述 |
|||
if(key!=null) |
|||
{ |
|||
let resValue=this.valueConverter(res[key],item); |
|||
let filedJSON={ |
|||
"formType": key.includes('TIME')?"datetime":"text", |
|||
"name":item.name, |
|||
"value":resValue, |
|||
"data":item |
|||
} |
|||
this.headDetails.push(filedJSON); |
|||
} |
|||
}); |
|||
|
|||
|
|||
// Object.keys(res).forEach((key)=>{ |
|||
// if (key == item.fieldName && key!='Description') //不显示描述 |
|||
// { |
|||
// let resValue=this.valueConverter(res[key],item); |
|||
// let filedJSON={ |
|||
// "formType": key.includes('TIME')?"datetime":"text", |
|||
// "name":item.name, |
|||
// "value":resValue, |
|||
// "data":item |
|||
// } |
|||
// this.headDetails.push(filedJSON); |
|||
// } |
|||
// }); |
|||
// }); |
|||
}, |
|||
|
|||
valueConverter(value,item) { |
|||
|
|||
if(item.formType==='switch') |
|||
{ |
|||
if(value===true) |
|||
{ |
|||
return '是' |
|||
} |
|||
else if(value===false) |
|||
{ |
|||
return '否' |
|||
} |
|||
else |
|||
{ |
|||
return '' |
|||
} |
|||
} |
|||
else if(item.formType==='select') |
|||
{ |
|||
//取select的值 |
|||
return value |
|||
} |
|||
else |
|||
{ |
|||
return value |
|||
} |
|||
}, |
|||
|
|||
/** 更多操作 */ |
|||
handleTypeClick(type) { |
|||
if (type == 'edit') { |
|||
// 编辑 |
|||
this.$emit('handle', { type: 'edit' }) |
|||
} |
|||
}, |
|||
hideView() { |
|||
this.$emit('close') |
|||
}, |
|||
// 子组件 回调的 结果 |
|||
handleCallBack(data) { |
|||
this.$emit('handle', { type: data.type }) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style lang="scss" scoped> |
|||
.t-section { |
|||
position: relative; |
|||
padding: 10px 17px; |
|||
min-height: 60px; |
|||
.t-img { |
|||
display: block; |
|||
width: 35px; |
|||
height: 35px; |
|||
margin-right: 10px; |
|||
} |
|||
.t-name { |
|||
font-size: 14px; |
|||
color: #333333; |
|||
flex: 1; |
|||
} |
|||
.t-more { |
|||
border: 1px solid #dcdfe6; |
|||
font-size: 12px; |
|||
color: #606266; |
|||
padding: 0 10px 0 12px; |
|||
border-radius: 2px; |
|||
font-weight: 500; |
|||
height: 25px; |
|||
cursor: pointer; |
|||
} |
|||
.t-close { |
|||
display: block; |
|||
width: 40px; |
|||
height: 40px; |
|||
margin-left: 20px; |
|||
padding: 10px; |
|||
cursor: pointer; |
|||
} |
|||
} |
|||
|
|||
.h-section { |
|||
position: relative; |
|||
padding: 8px 17px 15px 17px; |
|||
min-height: 58px; |
|||
overflow-x: auto; |
|||
.h-item { |
|||
.h-title { |
|||
font-size: 12px; |
|||
color: #777; |
|||
} |
|||
.h-value { |
|||
min-height: 14px; |
|||
margin-top: 8px; |
|||
font-size: 13px; |
|||
color: #333333; |
|||
} |
|||
} |
|||
} |
|||
.head-handle-button { |
|||
padding: 5px 15px; |
|||
margin-right: 10px; |
|||
} |
|||
</style> |
@ -0,0 +1,327 @@ |
|||
<template> |
|||
<el-dialog |
|||
:visible.sync="showDialog" |
|||
:title="'导出'+crmTypeName" |
|||
:append-to-body="true" |
|||
:close-on-click-modal="false" |
|||
:before-close="beforeClose" |
|||
:close-on-press-escape="false" |
|||
width="550px" |
|||
@close="closeView" |
|||
> |
|||
<div class="dialog-body"> |
|||
<p |
|||
v-if="error" |
|||
class="error" |
|||
v-text="error" /> |
|||
<p |
|||
v-if="done" |
|||
class="done"> |
|||
<i class="el-icon-success"/> |
|||
导出已完成 |
|||
</p> |
|||
<p |
|||
v-else-if="cancel" |
|||
class="cancel"> |
|||
<i class="el-icon-warning"/> |
|||
导出已取消 |
|||
</p> |
|||
<div v-else> |
|||
<i class="el-icon-loading" /> |
|||
导出中... |
|||
{{ progress }} |
|||
</div> |
|||
</div> |
|||
<span slot="footer" class="dialog-footer" /> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
import { mapGetters } from 'vuex' |
|||
// import { |
|||
// crmCustomerExcelExport, |
|||
// crmCustomerExcelAllExport, |
|||
// crmCustomerPoolExcelExportAPI |
|||
// } from '@/api/customermanagement/customer' |
|||
// import { crmLeadsExcelExport, crmLeadsExcelAllExport } from '@/api/customermanagement/clue' |
|||
// import { crmContactsExcelExport, crmContactsExcelAllExport } from '@/api/customermanagement/contacts' |
|||
// import { crmProductExcelExport, crmProductExcelAllExport } from '@/api/customermanagement/product' |
|||
// import { crmBusinessExcelExport, crmBusinessExcelAllExport } from '@/api/customermanagement/business' |
|||
// import { crmContractExcelExport, crmContractExcelAllExport } from '@/api/customermanagement/contract' |
|||
// import { crmReceivablesExcelExport, crmReceivablesExcelAllExport } from '@/api/customermanagement/money' |
|||
|
|||
export default { |
|||
name: 'CRMExport', // 文件导出 |
|||
components: {}, |
|||
|
|||
props: { |
|||
show: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
// CRM类型 |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
/** 是公海 */ |
|||
isSeas: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
// 搜索条件 |
|||
search: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
// 场景 |
|||
scene_id: { |
|||
type: [Number, String], |
|||
default: '' |
|||
}, |
|||
// 高级搜索 |
|||
filterObj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {} |
|||
} |
|||
}, |
|||
exportParams: { |
|||
type: Object, |
|||
default: () => { |
|||
return {} |
|||
} |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
showDialog: false, |
|||
progress: '', |
|||
error: '', |
|||
// 导出已完成 |
|||
done: false, |
|||
// 取消导出 |
|||
cancel: false, |
|||
// 队列标识 |
|||
exportQueueIndex: '', |
|||
// 临时数据 |
|||
tempData: { |
|||
temp_file: '' |
|||
}, |
|||
// 排序 |
|||
sortData: {} |
|||
} |
|||
}, |
|||
computed: { |
|||
...mapGetters(['userInfo']), |
|||
crmTypeName() { |
|||
return ( |
|||
{ |
|||
customer: '客户', |
|||
leads: '线索', |
|||
contacts: '联系人', |
|||
product: '产品' |
|||
}[this.crmType] || '' |
|||
) |
|||
} |
|||
}, |
|||
watch: { |
|||
show(val) { |
|||
this.showDialog = val |
|||
if (val) { |
|||
this.cancel = false |
|||
this.exportInfos() |
|||
window.onbeforeunload = (event) => { |
|||
this.exportInfos({ |
|||
page: -1, |
|||
temp_file: this.tempData.temp_file |
|||
}) |
|||
return event |
|||
} |
|||
} else { |
|||
window.onbeforeunload = null |
|||
} |
|||
} |
|||
}, |
|||
mounted() { |
|||
this.$bus.off('getSortData') |
|||
this.$bus.on('getSortData', (sortData) => { |
|||
this.sortData = sortData |
|||
}) |
|||
}, |
|||
methods: { |
|||
// 关闭操作 |
|||
closeView() { |
|||
this.error = '' |
|||
this.done = false |
|||
this.exportQueueIndex = '' |
|||
this.progress = '' |
|||
this.$emit('close') |
|||
}, |
|||
// 点叉 |
|||
beforeClose(done) { |
|||
if (this.error || this.done) { |
|||
done() |
|||
return |
|||
} |
|||
this.$confirm('此操作将终止导出, 是否继续?', '提示', { |
|||
confirmButtonText: '确定', |
|||
cancelButtonText: '取消', |
|||
type: 'warning' |
|||
}) |
|||
.then(() => { |
|||
this.cancel = true |
|||
done() |
|||
}) |
|||
.catch(() => { |
|||
}) |
|||
}, |
|||
// 导出操作 |
|||
exportInfos(data = {}) { |
|||
var params = { |
|||
export_queue_index: this.exportQueueIndex, |
|||
search: this.search, |
|||
...this.exportParams, |
|||
...this.sortData, |
|||
...data |
|||
} |
|||
if (this.scene_id) { |
|||
params.scene_id = this.scene_id |
|||
} |
|||
for (var key in this.filterObj) { |
|||
params[key] = this.filterObj[key] |
|||
} |
|||
|
|||
let exportAll = 'All' |
|||
if (params['ids']) { |
|||
exportAll = '' |
|||
} |
|||
|
|||
let request |
|||
// 公海的请求 |
|||
if (this.isSeas) { |
|||
request = crmCustomerPoolExcelExportAPI |
|||
} else { |
|||
request = { |
|||
customer: crmCustomerExcelExport, |
|||
customerAll: crmCustomerExcelAllExport, |
|||
leads: crmLeadsExcelExport, |
|||
leadsAll: crmLeadsExcelAllExport, |
|||
contacts: crmContactsExcelExport, |
|||
contactsAll: crmContactsExcelAllExport, |
|||
product: crmProductExcelExport, |
|||
productAll: crmProductExcelAllExport, |
|||
business: crmBusinessExcelExport, |
|||
businessAll: crmBusinessExcelAllExport, |
|||
contract: crmContractExcelExport, |
|||
contractAll: crmContractExcelAllExport, |
|||
receivables: crmReceivablesExcelExport, |
|||
receivablesAll: crmReceivablesExcelAllExport |
|||
}[this.crmType + exportAll] |
|||
} |
|||
request(params) |
|||
.then(res => { |
|||
if (res.data.type.indexOf('json') !== -1) { |
|||
var blob = new Blob([res.data], { |
|||
type: 'application/json' |
|||
}) |
|||
var reader = new FileReader() |
|||
reader.readAsText(blob, 'utf-8') |
|||
reader.onload = () => { |
|||
var temp = JSON.parse(reader.result) |
|||
this.tempData = temp.data |
|||
if (temp.error) { |
|||
this.error = temp.error |
|||
return |
|||
} |
|||
this.exportQueueIndex = temp.data.export_queue_index |
|||
if (this.cancel) { |
|||
if (temp.data.page !== -1) { |
|||
this.exportInfos({ |
|||
page: -1, |
|||
temp_file: temp.data.temp_file |
|||
}) |
|||
} |
|||
} else if (temp.data.page === -2) { |
|||
setTimeout(() => { |
|||
this.exportInfos({ |
|||
page: 1, |
|||
temp_file: temp.data.temp_file |
|||
}) |
|||
}, 1000) |
|||
} else if (temp.data.page > 0) { |
|||
this.exportInfos({ |
|||
page: temp.data.page, |
|||
temp_file: temp.data.temp_file |
|||
}) |
|||
this.progress = String(temp.data.done) + ' / ' + String(temp.data.total) |
|||
} |
|||
} |
|||
} else { |
|||
this.exportQueueIndex = '' |
|||
this.done = true |
|||
var blob = new Blob([res.data], { |
|||
type: 'application/vnd.ms-excel;charset=utf-8' |
|||
}) |
|||
var downloadElement = document.createElement('a') |
|||
var href = window.URL.createObjectURL(blob) // 创建下载的链接 |
|||
downloadElement.href = href |
|||
downloadElement.download = |
|||
decodeURI( |
|||
res.headers['content-disposition'].split('filename=')[1] |
|||
) || '' // 下载后文件名 |
|||
document.body.appendChild(downloadElement) |
|||
downloadElement.click() // 点击下载 |
|||
document.body.removeChild(downloadElement) // 下载完成移除元素 |
|||
window.URL.revokeObjectURL(href) // 释放掉blob对象 |
|||
} |
|||
}) |
|||
.catch(() => { |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang="scss"> |
|||
|
|||
.dialog-body { |
|||
height: 150px; |
|||
text-align: center; |
|||
padding-top: 40px; |
|||
color: #659DED; |
|||
.el-icon-loading { |
|||
margin-bottom: 10px; |
|||
display: block; |
|||
} |
|||
p.error { |
|||
color: #E6A23C; |
|||
} |
|||
p.done { |
|||
color: #67C23A; |
|||
.el-icon-success { |
|||
font-size: 30px; |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.cancel { |
|||
color: #E6A23C; |
|||
.el-icon-warning { |
|||
font-size: 30px; |
|||
display: block; |
|||
} |
|||
} |
|||
|
|||
.el-dialog__wrapper { |
|||
/deep/ .el-icon-loading { |
|||
font-size: 30px; |
|||
} |
|||
|
|||
/deep/ .el-loading-text { |
|||
font-size: 18px; |
|||
margin-top: 10px; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,257 @@ |
|||
<template> |
|||
<el-dialog |
|||
:visible.sync="showDialog" |
|||
:title="'导出'+crmTypeName" |
|||
:append-to-body="true" |
|||
:close-on-click-modal="false" |
|||
:before-close="beforeClose" |
|||
:close-on-press-escape="false" |
|||
width="550px" |
|||
@close="closeView" |
|||
> |
|||
<div class="dialog-body"> |
|||
<p |
|||
v-if="error" |
|||
class="error" |
|||
v-text="error" /> |
|||
<p |
|||
v-if="done" |
|||
class="done"> |
|||
<i class="el-icon-success"/> |
|||
导出已完成 |
|||
</p> |
|||
<p |
|||
v-else-if="cancel" |
|||
class="cancel"> |
|||
<i class="el-icon-warning"/> |
|||
导出已取消 |
|||
</p> |
|||
<div v-else> |
|||
<i class="el-icon-loading" /> |
|||
导出中... |
|||
{{ progress }} |
|||
</div> |
|||
</div> |
|||
<span slot="footer" class="dialog-footer" /> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
import { winUomGroupExcelAllExport } from '@/api/uomGroup/uomGroup' |
|||
import { downloadFile } from '@/utils/crmindex.js' |
|||
|
|||
|
|||
|
|||
export default { |
|||
name: 'CRMExport', // 文件导出 |
|||
components: {}, |
|||
|
|||
props: { |
|||
show: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
// CRM类型 |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
/** 是公海 */ |
|||
isSeas: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
// 搜索条件 |
|||
search: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
// 高级搜索 |
|||
filterObj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {} |
|||
} |
|||
}, |
|||
exportParams: { |
|||
type: Object, |
|||
default: () => { |
|||
return {} |
|||
} |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
showDialog: false, |
|||
progress: '', |
|||
error: '', |
|||
// 导出已完成 |
|||
done: false, |
|||
// 取消导出 |
|||
cancel: false, |
|||
// 队列标识 |
|||
exportQueueIndex: '', |
|||
// 临时数据 |
|||
tempData: { |
|||
temp_file: '' |
|||
}, |
|||
// 排序 |
|||
sortData: {} |
|||
} |
|||
}, |
|||
computed: { |
|||
crmTypeName() { |
|||
return ( |
|||
{ |
|||
uomGroup: '计量单位组' |
|||
}[this.crmType] || '' |
|||
) |
|||
} |
|||
}, |
|||
watch: { |
|||
show(val) { |
|||
this.showDialog = val |
|||
if (val) { |
|||
this.cancel = false |
|||
this.exportInfos() |
|||
window.onbeforeunload = (event) => { |
|||
this.exportInfos({ |
|||
page: -1, |
|||
temp_file: this.tempData.temp_file |
|||
}) |
|||
return event |
|||
} |
|||
} else { |
|||
window.onbeforeunload = null |
|||
} |
|||
} |
|||
}, |
|||
mounted() { |
|||
this.$bus.off('getSortData') |
|||
this.$bus.on('getSortData', (sortData) => { |
|||
this.sortData = sortData |
|||
}) |
|||
}, |
|||
methods: { |
|||
// 关闭操作 |
|||
closeView() { |
|||
this.error = '' |
|||
this.done = false |
|||
this.exportQueueIndex = '' |
|||
this.progress = '' |
|||
this.$emit('close') |
|||
}, |
|||
// 点叉 |
|||
beforeClose(done) { |
|||
if (this.error || this.done) { |
|||
done() |
|||
return |
|||
} |
|||
this.$confirm('此操作将终止导出, 是否继续?', '提示', { |
|||
confirmButtonText: '确定', |
|||
cancelButtonText: '取消', |
|||
type: 'warning' |
|||
}) |
|||
.then(() => { |
|||
this.cancel = true |
|||
done() |
|||
}) |
|||
.catch(() => { |
|||
}) |
|||
}, |
|||
// 导出操作 |
|||
exportInfos(data = {}) { |
|||
// var params = { |
|||
// export_queue_index: this.exportQueueIndex, |
|||
// search: this.search, |
|||
// ...this.exportParams, |
|||
// ...this.sortData, |
|||
// ...data |
|||
// } |
|||
var params = { |
|||
//有组织ID传入 |
|||
} |
|||
// for (var key in this.filterObj) { |
|||
// params[key] = this.filterObj[key] |
|||
// } |
|||
|
|||
let exportAll = 'All' |
|||
if (params['ids']) { |
|||
exportAll = '' |
|||
} |
|||
|
|||
// let request = { |
|||
// uomGroup: crmReceivablesExcelAllExport |
|||
// }[this.crmType + exportAll] |
|||
let request = { |
|||
uomGroup: winUomGroupExcelAllExport |
|||
}[this.crmType] |
|||
request(params) |
|||
.then(res => { |
|||
var downExportExcelName=res;//获取生成到服务器上的导出excel文件名称 |
|||
this.$axios |
|||
.BolbGets('/api/basedataservice/exceltemplate/downloadExcelFiles/' + downExportExcelName) |
|||
.then((response) => { |
|||
downloadFile(response, this.crmTypeName+'导出数据.xlsx') |
|||
this.error = '' |
|||
this.done = false |
|||
this.exportQueueIndex = '' |
|||
this.progress = '' |
|||
this.$emit('close') |
|||
this.$notify({ |
|||
title: '成功', |
|||
message: '数据导出成功!', |
|||
type: 'success', |
|||
duration: 2000 |
|||
}) |
|||
}) |
|||
}) |
|||
.catch(() => { |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang="scss"> |
|||
|
|||
.dialog-body { |
|||
height: 150px; |
|||
text-align: center; |
|||
padding-top: 40px; |
|||
color: #659DED; |
|||
.el-icon-loading { |
|||
margin-bottom: 10px; |
|||
display: block; |
|||
} |
|||
p.error { |
|||
color: #E6A23C; |
|||
} |
|||
p.done { |
|||
color: #67C23A; |
|||
.el-icon-success { |
|||
font-size: 30px; |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.cancel { |
|||
color: #E6A23C; |
|||
.el-icon-warning { |
|||
font-size: 30px; |
|||
display: block; |
|||
} |
|||
} |
|||
|
|||
.el-dialog__wrapper { |
|||
/deep/ .el-icon-loading { |
|||
font-size: 30px; |
|||
} |
|||
|
|||
/deep/ .el-loading-text { |
|||
font-size: 18px; |
|||
margin-top: 10px; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,668 @@ |
|||
<template> |
|||
<el-dialog |
|||
:visible="show" |
|||
:title="'导入'+crmTypeName" |
|||
:append-to-body="true" |
|||
:close-on-click-modal="false" |
|||
width="600px" |
|||
@close="closeView"> |
|||
<div class="dialog-body"> |
|||
<!-- <el-steps |
|||
:active="stepsActive" |
|||
simple> |
|||
<el-step |
|||
v-for="(item, index) in stepList" |
|||
:key="index" |
|||
:title="item.title" |
|||
:icon="item.icon" |
|||
:status="item.status" /> |
|||
</el-steps> --> |
|||
|
|||
<div v-if="stepsActive == 1" class="step-section"> |
|||
<div class="sections"> |
|||
<div class="sections__title">一、请按照数据模板的格式准备要导入的数据。<span |
|||
class="download" |
|||
@click="download">点击下载《{{ crmTypeName }}导入模板》</span></div> |
|||
<div class="sections__tips">导入文件请勿超过2MB(约10,000条数据)</div> |
|||
</div> |
|||
<div class="sections"> |
|||
<div class="sections__title">二、请选择数据重复时的处理方式(查重规则:【{{ fieldUniqueInfo }}】)</div> |
|||
<div class="sections__tips">查重规则为:添加{{ crmTypeName }}时所需填写的所有唯一字段,当前设置唯一字段为:{{ fieldUniqueInfo }}</div> |
|||
<div class="content"> |
|||
<el-select |
|||
v-model="config" |
|||
placeholder="请选择"> |
|||
<el-option |
|||
v-for="(item, index) in [{name: '覆盖系统原有数据',value: 1},{name: '跳过',value: 2}]" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value"/> |
|||
</el-select> |
|||
</div> |
|||
</div> |
|||
<div class="sections"> |
|||
<div class="sections__title">三、请选择需要导入的文件</div> |
|||
<div class="content"> |
|||
<flexbox class="file-select"> |
|||
<el-input |
|||
v-model="file.name" |
|||
:disabled="true"/> |
|||
<el-button |
|||
type="primary" |
|||
@click="selectFile">选择文件</el-button> |
|||
</flexbox> |
|||
</div> |
|||
</div> |
|||
<div class="sections"> |
|||
<div class="sections__title">四、请选择负责人({{ crmType == 'customer' ? '如不选择,导入的客户将进入公海' : '必选' }})</div> |
|||
<div class="content"> |
|||
<div class="user-cell"> |
|||
<xh-user-cell |
|||
:value="user" |
|||
@value-change="userSelect"/> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div |
|||
v-loading="loading" |
|||
v-else-if="stepsActive == 2" |
|||
element-loading-text="数据导入中" |
|||
element-loading-spinner="el-icon-loading" |
|||
class="step-section" /> |
|||
|
|||
<div |
|||
v-loading="loading" |
|||
v-else-if="stepsActive == 3" |
|||
class="step-section"> |
|||
<div class="result-info"> |
|||
<i class="wk wk-success result-info__icon" /> |
|||
<p class="result-info__des">数据导入完成</p> |
|||
<p class="result-info__detail">导入总数据<span class="result-info__detail--all">{{ resultData.totalSize }}</span>条,导入成功<span class="result-info__detail--suc">{{ resultData.totalSize - resultData.errSize }}</span>条,导入失败<span class="result-info__detail--err">{{ resultData.errSize }}</span>条</p> |
|||
<el-button |
|||
v-if="resultData && resultData.errSize > 0" |
|||
class="result-info__btn--err" |
|||
type="text" |
|||
@click="downloadErrData">下载错误数据</el-button> |
|||
</div> |
|||
</div> |
|||
|
|||
<input |
|||
id="importInputFile" |
|||
type="file" |
|||
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" |
|||
@change="uploadFile"> |
|||
</div> |
|||
<span |
|||
slot="footer" |
|||
class="dialog-footer"> |
|||
<el-popover |
|||
v-model="historyPopoverShow" |
|||
placement="top" |
|||
width="800" |
|||
popper-class="no-padding-popover" |
|||
trigger="click"> |
|||
<!-- <c-r-m-import-history |
|||
:show="historyPopoverShow" |
|||
:crm-type="crmType" |
|||
@close="historyPopoverShow = false" /> |
|||
<el-button |
|||
slot="reference" |
|||
class="history-btn" |
|||
type="text">查看历史导入记录</el-button> --> |
|||
</el-popover> |
|||
|
|||
|
|||
|
|||
<el-button |
|||
:class="{ 'is-hidden': !showCancel }" |
|||
@click="closeView">取消</el-button> |
|||
<el-button |
|||
v-if="sureTitle" |
|||
type="primary" |
|||
@click="sureClick">{{ sureTitle }}</el-button> |
|||
</span> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
// import { |
|||
// crmQueryImportNumAPI, |
|||
// crmQueryImportInfoAPI, |
|||
// crmDownImportErrorAPI, |
|||
// filedGetField |
|||
// } from '@/api/customermanagement/common' |
|||
// import { |
|||
// crmCustomerExcelImport, |
|||
// crmCustomerDownloadExcelAPI |
|||
// } from '@/api/customermanagement/customer' |
|||
// import { |
|||
// crmLeadsExcelImport, |
|||
// crmLeadsDownloadExcelAPI |
|||
// } from '@/api/customermanagement/clue' |
|||
// import { |
|||
// crmContactsExcelImport, |
|||
// crmContactsDownloadExcelAPI |
|||
// } from '@/api/customermanagement/contacts' |
|||
// import { |
|||
// crmProductExcelImport, |
|||
// crmProductDownloadExcelAPI |
|||
// } from '@/api/customermanagement/product' |
|||
|
|||
import { XhUserCell } from '@/components/CreateCom' |
|||
// import CRMImportHistory from './CRMImportHistory' |
|||
|
|||
import { mapGetters } from 'vuex' |
|||
import crmTypeModel from '@/views/ux/model/crmTypeModel' |
|||
import { downloadExcelWithResData } from '@/utils/index' |
|||
|
|||
export default { |
|||
name: 'CRMImport', // 文件导入 |
|||
components: { |
|||
XhUserCell |
|||
}, |
|||
props: { |
|||
show: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
// CRM类型 |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
loading: false, |
|||
fieldList: [], |
|||
config: 1, // 1 覆盖,2跳过 |
|||
file: { name: '' }, |
|||
user: [], |
|||
|
|||
stepsActive: 1, |
|||
stepList: [ |
|||
{ |
|||
icon: 'wk wk-upload', |
|||
title: '上传文件', |
|||
status: 'wait' |
|||
}, |
|||
{ |
|||
icon: 'wk wk-data-import', |
|||
title: '导入数据', |
|||
status: 'wait' |
|||
}, |
|||
{ |
|||
icon: 'wk wk-success', |
|||
title: '导入完成', |
|||
status: 'wait' |
|||
} |
|||
], |
|||
resultData: null, |
|||
processData: { |
|||
count: 0, |
|||
status: '' |
|||
}, |
|||
messageId: null, |
|||
intervalTimer: null, |
|||
|
|||
historyPopoverShow: false |
|||
} |
|||
}, |
|||
computed: { |
|||
...mapGetters(['userInfo']), |
|||
|
|||
crmTypeName() { |
|||
return ( |
|||
{ |
|||
customer: '客户', |
|||
leads: '线索', |
|||
contacts: '联系人', |
|||
product: '产品' |
|||
}[this.crmType] || '' |
|||
) |
|||
}, |
|||
|
|||
sureTitle() { |
|||
return { |
|||
1: '立即导入', |
|||
2: '最小化', |
|||
3: '确定' |
|||
}[this.stepsActive] |
|||
}, |
|||
|
|||
showCancel() { |
|||
return this.stepsActive != 2 |
|||
}, |
|||
|
|||
fieldUniqueInfo() { |
|||
const uniqueList = this.fieldList.filter(item => { |
|||
return item.isUnique == 1 |
|||
}) |
|||
|
|||
return uniqueList.map(item => { |
|||
return item.name |
|||
}).join('/') || '无' |
|||
} |
|||
}, |
|||
watch: { |
|||
show: function(val) { |
|||
if (val) { |
|||
if (this.stepsActive == 1) { |
|||
if (this.userInfo) { |
|||
this.user = [this.userInfo] |
|||
} |
|||
} |
|||
|
|||
this.getField() |
|||
} else { |
|||
if (this.stepsActive == 3) { |
|||
this.resetData() |
|||
} |
|||
|
|||
this.fieldList = [] |
|||
} |
|||
}, |
|||
|
|||
stepsActive() { |
|||
this.$emit('status', { |
|||
1: 'wait', |
|||
2: 'process', |
|||
3: 'finish' |
|||
}[this.stepsActive]) |
|||
} |
|||
|
|||
// file() { |
|||
// this.getFirstStepStatus() |
|||
// }, |
|||
|
|||
// user() { |
|||
// this.getFirstStepStatus() |
|||
// } |
|||
|
|||
}, |
|||
mounted() { |
|||
}, |
|||
methods: { |
|||
sureClick() { |
|||
if (this.stepsActive == 1) { |
|||
if (this.stepList[0].status == 'finish') { |
|||
this.stepList[1].status = 'process' |
|||
this.stepsActive = 2 |
|||
this.firstUpdateFile(res => { |
|||
this.messageId = res.data |
|||
this.secondQueryNum() |
|||
this.intervalTimer = setInterval(() => { |
|||
if (this.processData.status == 'end') { |
|||
clearInterval(this.intervalTimer) |
|||
this.intervalTimer = null |
|||
this.thirdQueryResult() |
|||
} else { |
|||
this.secondQueryNum() |
|||
} |
|||
}, 2000) |
|||
}) |
|||
} else { |
|||
if (!this.file.name) { |
|||
this.$message.error('请选择导入文件') |
|||
} else if ( |
|||
this.crmType != 'customer' && |
|||
(!this.user || this.user.length == 0) |
|||
) { |
|||
this.$message.error('请选择负责人') |
|||
} |
|||
} |
|||
} else { |
|||
this.closeView() |
|||
} |
|||
}, |
|||
|
|||
|
|||
/** |
|||
* 第一步上传 |
|||
*/ |
|||
firstUpdateFile(result) { |
|||
var params = {} |
|||
params.repeatHandling = this.config |
|||
params.file = this.file |
|||
params.ownerUserId = this.user.length > 0 ? this.user[0].userId : '' |
|||
var request = { |
|||
customer: crmCustomerExcelImport, |
|||
leads: crmLeadsExcelImport, |
|||
contacts: crmContactsExcelImport, |
|||
product: crmProductExcelImport |
|||
}[this.crmType] |
|||
this.loading = true |
|||
request(params) |
|||
.then(res => { |
|||
if (result) { |
|||
result(res) |
|||
} |
|||
}) |
|||
.catch(() => { |
|||
if (result) { |
|||
result(false) |
|||
} |
|||
this.loading = false |
|||
}) |
|||
}, |
|||
|
|||
/** |
|||
* 第二步查询数量 |
|||
*/ |
|||
secondQueryNum() { |
|||
crmQueryImportNumAPI({ messageId: this.messageId }) |
|||
.then(res => { |
|||
if (res.data === null) { |
|||
this.processData.status = 'end' |
|||
} else { |
|||
this.processData.status = '' |
|||
this.processData.count = res.data |
|||
} |
|||
}) |
|||
.catch(() => { |
|||
// this.processData.status = 'err' |
|||
}) |
|||
}, |
|||
|
|||
/** |
|||
* 第三部 查询结果 |
|||
*/ |
|||
thirdQueryResult() { |
|||
crmQueryImportInfoAPI({ messageId: this.messageId }) |
|||
.then(res => { |
|||
this.loading = false |
|||
this.stepList[1].status = 'finish' |
|||
this.stepsActive = 3 |
|||
this.$emit('status', 'finish') |
|||
if (res) { |
|||
this.resultData = res |
|||
if (res.errSize > 0) { |
|||
this.stepList[2].status = 'error' |
|||
} else { |
|||
this.stepList[2].status = 'finish' |
|||
} |
|||
} |
|||
}) |
|||
.catch(() => {}) |
|||
}, |
|||
|
|||
/** |
|||
* 下载错误模板 |
|||
*/ |
|||
downloadErrData() { |
|||
this.loading = true |
|||
crmDownImportErrorAPI({ messageId: this.messageId }) |
|||
.then(res => { |
|||
downloadExcelWithResData(res) |
|||
this.loading = false |
|||
}) |
|||
.catch(() => { |
|||
this.loading = false |
|||
}) |
|||
}, |
|||
|
|||
// 下载模板操作 |
|||
download() { |
|||
const request = { |
|||
customer: crmCustomerDownloadExcelAPI, |
|||
leads: crmLeadsDownloadExcelAPI, |
|||
contacts: crmContactsDownloadExcelAPI, |
|||
product: crmProductDownloadExcelAPI |
|||
}[this.crmType] |
|||
request() |
|||
.then(res => { |
|||
var blob = new Blob([res.data], { |
|||
type: 'application/vnd.ms-excel;charset=utf-8' |
|||
}) |
|||
var downloadElement = document.createElement('a') |
|||
var href = window.URL.createObjectURL(blob) // 创建下载的链接 |
|||
downloadElement.href = href |
|||
downloadElement.download = |
|||
decodeURI( |
|||
res.headers['content-disposition'].split('filename=')[1] |
|||
) || '' // 下载后文件名 |
|||
document.body.appendChild(downloadElement) |
|||
downloadElement.click() // 点击下载 |
|||
document.body.removeChild(downloadElement) // 下载完成移除元素 |
|||
window.URL.revokeObjectURL(href) // 释放掉blob对象 |
|||
}) |
|||
.catch(() => {}) |
|||
}, |
|||
// 选择文件 |
|||
selectFile() { |
|||
document.getElementById('importInputFile').click() |
|||
}, |
|||
/** 图片选择出发 */ |
|||
uploadFile(event) { |
|||
var files = event.target.files |
|||
const file = files[0] |
|||
this.file = file |
|||
event.target.value = '' |
|||
|
|||
// 阶段一状态 |
|||
this.getFirstStepStatus() |
|||
}, |
|||
// 用户选择 |
|||
userSelect(data) { |
|||
if (data.value && data.value.length > 0) { |
|||
this.user = data.value |
|||
} else { |
|||
this.user = [] |
|||
} |
|||
|
|||
// 阶段一状态 |
|||
this.getFirstStepStatus() |
|||
}, |
|||
|
|||
getFirstStepStatus() { |
|||
// 阶段一状态 |
|||
const hasFile = this.file && this.file.size |
|||
const hasUser = this.user && this.user.length > 0 |
|||
|
|||
if (this.crmType === 'customer') { |
|||
this.stepList[0].status = hasFile ? 'finish' : 'wait' |
|||
} else { |
|||
this.stepList[0].status = hasFile && hasUser ? 'finish' : 'wait' |
|||
} |
|||
}, |
|||
|
|||
// 关闭操作 |
|||
closeView() { |
|||
this.$emit('update:show', false) |
|||
this.$emit('close', this.stepsActive == 3 ? 'finish' : '') |
|||
}, |
|||
|
|||
/** |
|||
* 重置页面数据 |
|||
*/ |
|||
resetData() { |
|||
this.config = 1 |
|||
this.file = { name: '' } |
|||
this.user = [] |
|||
|
|||
this.stepsActive = 1 |
|||
this.stepList = [ |
|||
{ |
|||
icon: 'wk wk-upload', |
|||
title: '上传文件', |
|||
status: 'wait' |
|||
}, |
|||
{ |
|||
icon: 'wk wk-data-import', |
|||
title: '导入数据', |
|||
status: 'wait' |
|||
}, |
|||
{ |
|||
icon: 'wk wk-success', |
|||
title: '导入完成', |
|||
status: 'wait' |
|||
} |
|||
] |
|||
this.resultData = null |
|||
this.processData = { |
|||
count: 0, |
|||
status: '' |
|||
} |
|||
this.messageId = null |
|||
}, |
|||
|
|||
/** |
|||
* 获取验证字段 |
|||
*/ |
|||
getField() { |
|||
var params = { |
|||
label: crmTypeModel[this.crmType] |
|||
} |
|||
|
|||
filedGetField(params) |
|||
.then(res => { |
|||
this.fieldList = res.data |
|||
}) |
|||
.catch(() => { |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang="scss"> |
|||
.el-steps { |
|||
margin-bottom: 15px; |
|||
|
|||
/deep/ .el-step__title { |
|||
font-size: 14px; |
|||
} |
|||
|
|||
/deep/ .el-step.is-simple .el-step__arrow::before, |
|||
/deep/ .el-step.is-simple .el-step__arrow::after { |
|||
height: 10px; |
|||
width: 2px; |
|||
} |
|||
|
|||
/deep/ .el-step.is-simple .el-step__arrow::after { |
|||
transform: rotate(45deg) translateY(3px); |
|||
} |
|||
/deep/ .el-step.is-simple .el-step__arrow::before { |
|||
transform: rotate(-45deg) translateY(-2px); |
|||
} |
|||
} |
|||
|
|||
.step-section { |
|||
min-height: 300px; |
|||
|
|||
/deep/ .el-loading-spinner { |
|||
top: 45%; |
|||
.el-icon-loading { |
|||
font-size: 40px; |
|||
color: #999; |
|||
} |
|||
|
|||
.el-loading-text { |
|||
color: #333; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.sections { |
|||
font-size: 14px; |
|||
color: #333; |
|||
|
|||
&__title { |
|||
font-weight: 600; |
|||
} |
|||
|
|||
&__tips { |
|||
padding-left: 30px; |
|||
margin: 8px 0 15px; |
|||
color: #999; |
|||
font-size: 12px; |
|||
line-height: 1.4; |
|||
} |
|||
|
|||
.download { |
|||
cursor: pointer; |
|||
color: #2362FB; |
|||
} |
|||
|
|||
} |
|||
|
|||
.sections__tips + .content { |
|||
padding-top: 0; |
|||
} |
|||
|
|||
.content { |
|||
padding: 10px 10px 10px 30px; |
|||
.el-select { |
|||
width: 400px; |
|||
} |
|||
.user-cell { |
|||
width: 400px; |
|||
} |
|||
} |
|||
|
|||
#importInputFile { |
|||
display: none; |
|||
} |
|||
|
|||
.file-select { |
|||
.el-input { |
|||
width: 400px; |
|||
} |
|||
button { |
|||
margin-left: 20px; |
|||
} |
|||
} |
|||
|
|||
.is-hidden { |
|||
visibility: hidden; |
|||
} |
|||
|
|||
.history-btn { |
|||
float: left; |
|||
margin-left: 15px; |
|||
} |
|||
|
|||
|
|||
// 结果信息 |
|||
.result-info { |
|||
text-align: center; |
|||
padding-top: 80px; |
|||
|
|||
&__icon { |
|||
font-size: 40px; |
|||
color: #3E84E9; |
|||
} |
|||
|
|||
&__des { |
|||
margin-top: 15px; |
|||
color: #333; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
&__detail { |
|||
margin-top: 15px; |
|||
font-size: 12px; |
|||
color: #666; |
|||
&--all { |
|||
color: #333; |
|||
font-weight: 600; |
|||
} |
|||
|
|||
&--suc { |
|||
color: #3E84E9; |
|||
font-weight: 600; |
|||
} |
|||
|
|||
&--err { |
|||
color: #f94e4e; |
|||
font-weight: 600; |
|||
} |
|||
} |
|||
|
|||
&__btn--err { |
|||
margin-top: 10px; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,591 @@ |
|||
<template> |
|||
<el-dialog |
|||
:visible="show" |
|||
:title="'导入'+crmTypeName" |
|||
:append-to-body="true" |
|||
:close-on-click-modal="false" |
|||
width="600px" |
|||
@close="closeView"> |
|||
<div class="dialog-body"> |
|||
<div v-if="stepsActive == 1" class="step-section"> |
|||
|
|||
<div class="sections"> |
|||
<div class="sections__title" v-loading="loading"> |
|||
一、初始生成模板: |
|||
<span class="download" @click="createTemplate">点击生成《{{ crmTypeName }}导入模板》</span> |
|||
<div class="sections__tips">通过值映射,可保持生成的模板最新,例如自动生成下拉列表项!</div> |
|||
</div> |
|||
</div> |
|||
<div class="sections"> |
|||
<div class="sections__title"> |
|||
二、请按照数据模板的格式准备要导入的数据。 |
|||
<span class="download" @click="download">点击下载《{{ crmTypeName }}导入模板》</span> |
|||
</div> |
|||
<div class="sections__tips">1、模板名称可以进行修改,但不要删除模板中设置的字段!</div> |
|||
<div class="sections__tips" style="margin-top:-10px;">2、必填项列头会标红标*!</div> |
|||
<div class="sections__tips" style="margin-top:-10px;">3、导入文件请勿超过2MB!且只能上传Excel,但不支持“.xls”文件,即不支持Excel97-2003!</div> |
|||
</div> |
|||
<div class="sections"> |
|||
<div class="sections__title">三、请选择需要导入的文件</div> |
|||
<div class="content"> |
|||
<flexbox class="file-select"> |
|||
<el-upload |
|||
ref="upload" |
|||
class="avatar-uploader" |
|||
drag |
|||
action="#" |
|||
:http-request="httpRequestfiles" |
|||
:headers="httpHeader" |
|||
:file-list="fileuploadList" |
|||
:before-upload="beforeAvatarUpload" |
|||
:before-remove="beforeRemove" |
|||
:on-remove="handleRemove" |
|||
multiple |
|||
:limit="1"> |
|||
<i class="el-icon-upload" ></i> |
|||
<div class="el-upload__text"> |
|||
将文件拖到此处,或 |
|||
<em>点击上传</em> |
|||
</div> |
|||
</el-upload> |
|||
</flexbox> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
<div |
|||
v-loading="loading" |
|||
v-else-if="stepsActive == 2" |
|||
element-loading-text="数据导入中,请耐心等待..." |
|||
element-loading-spinner="el-icon-loading" |
|||
class="step-section" |
|||
/> |
|||
|
|||
<div |
|||
v-loading="loading" |
|||
v-else-if="stepsActive == 3" |
|||
class="step-section"> |
|||
<div class="result-info"> |
|||
<el-card style="height:300px;margin-top:-20px" shadow="always"> |
|||
<i class="wk wk-success result-info__icon" /> |
|||
<p class="result-info__des">数据导入结果:</p> |
|||
<!-- <p class="result-info__detail">导入总数据<span class="result-info__detail--all">{{ this.resultData.totalSize }}</span>条,导入成功<span class="result-info__detail--suc">{{ this.resultData.totalSize - this.resultData.errSize }}</span>条,导入失败<span class="result-info__detail--err">{{ this.resultData.errSize }}</span>条</p> --> |
|||
<p class="result-info__detail">导入总数据<span class="result-info__detail--all">{{ this.resultData.totalSize }}</span>条,导入成功<span class="result-info__detail--suc">{{ this.resultData.succeessSize }}</span>条,导入失败<span class="result-info__detail--err">{{ this.resultData.errSize }}</span>条</p> |
|||
<el-button |
|||
v-if="this.resultData && this.resultData.errSize > 0" |
|||
class="result-info__btn--err" |
|||
type="text" |
|||
@click="downloadErrData">下载错误数据</el-button> |
|||
</el-card> |
|||
</div> |
|||
</div> |
|||
|
|||
<div |
|||
v-loading="loading" |
|||
v-else-if="stepsActive ==4" |
|||
class="step-section"> |
|||
<div class="result-info"> |
|||
<el-card style="height:300px" shadow="always"> |
|||
<i class="wk wk-success result-info__icon" /> |
|||
<p class="result-info__des">数据导入结果:</p> |
|||
<!-- <p class="result-info__detail">导入总数据<span class="result-info__detail--all">{{ this.resultData.totalSize }}</span>条,导入成功<span class="result-info__detail--suc">{{ this.resultData.totalSize - this.resultData.errSize }}</span>条,导入失败<span class="result-info__detail--err">{{ this.resultData.errSize }}</span>条</p> --> |
|||
<p class="result-info__detail">导入总数据<span class="result-info__detail--all">{{ this.resultData.totalSize }}</span>条,导入成功<span class="result-info__detail--suc">{{ this.resultData.succeessSize }}</span>条,当前失败<span class="result-info__detail--err">{{ this.resultData.errSize }}</span>条</p> |
|||
<p class="result-info__detail--err" >数据错误信息:</p> |
|||
<p class="result-info__detail">{{this.resultData.errMessage}}</p> |
|||
</el-card> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
<span slot="footer" class="dialog-footer"> |
|||
<el-popover |
|||
v-model="historyPopoverShow" |
|||
placement="top" |
|||
width="800" |
|||
popper-class="no-padding-popover" |
|||
trigger="click" |
|||
> |
|||
|
|||
</el-popover> |
|||
|
|||
<!-- <el-button @click="closeView">取消</el-button> --> |
|||
<el-button |
|||
:class="{ 'is-hidden': !showCancel }" |
|||
@click="closeView">取消</el-button> |
|||
<el-button |
|||
v-if="sureTitle" |
|||
type="primary" |
|||
@click="sureClick">{{ sureTitle }}</el-button> |
|||
</span> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
|
|||
import {downloadFile} from '@/utils/crmindex.js' |
|||
import { getToken } from '@/utils/auth' // get token from cookie |
|||
//业务--生成模板接口 |
|||
import { winUomGroupExcelImportTemplate,winUomGroupExcelImport} from '@/api/uomGroup/uomGroup' |
|||
|
|||
|
|||
|
|||
export default { |
|||
name: "CRMImport", // 文件导入 |
|||
props: { |
|||
show: { |
|||
type: Boolean, |
|||
default: false, |
|||
}, |
|||
// CRM类型 |
|||
crmType: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
loading: false, |
|||
fieldList: [], |
|||
config: 1, // 1 覆盖,2跳过 |
|||
//file: { name: "" }, |
|||
user: [], |
|||
|
|||
stepsActive: 1, |
|||
stepList: [ |
|||
{ |
|||
icon: "wk wk-upload", |
|||
title: "上传文件", |
|||
status: "wait", |
|||
}, |
|||
{ |
|||
icon: "wk wk-data-import", |
|||
title: "导入数据", |
|||
status: "wait", |
|||
}, |
|||
{ |
|||
icon: "wk wk-success", |
|||
title: "导入完成", |
|||
status: "wait", |
|||
}, |
|||
], |
|||
//resultData: null, |
|||
resultData:{ |
|||
totalSize:0, |
|||
errSize:0, |
|||
errTemplate:"", |
|||
errMessage:"" |
|||
}, |
|||
processData: { |
|||
count: 0, |
|||
status: "", |
|||
}, |
|||
messageId: null, |
|||
intervalTimer: null, |
|||
fileuploadList:[], |
|||
isLt2M:"", |
|||
isFileType:"", |
|||
historyPopoverShow: false, |
|||
}; |
|||
}, |
|||
computed: { |
|||
sureTitle() { |
|||
return { |
|||
1: '立即导入', |
|||
2: '最小化', |
|||
3: '确定' |
|||
}[this.stepsActive] |
|||
}, |
|||
showCancel() { |
|||
return this.stepsActive != 2 |
|||
}, |
|||
crmTypeName() {//根据传入的crmType进行翻译 |
|||
return ( |
|||
{ |
|||
uomGroup: "计量单位组", |
|||
}[this.crmType] || "" |
|||
); |
|||
}, |
|||
getImportTemplate() {//模板名称 |
|||
return ( |
|||
{ |
|||
uomGroup: '计量单位组信息导入模板.xlsx', |
|||
}[this.crmType] || "" |
|||
); |
|||
}, |
|||
httpHeader() { |
|||
return { |
|||
'Authorization':'Bearer ' + getToken() |
|||
} |
|||
} |
|||
}, |
|||
watch: { |
|||
show: function (val) { |
|||
if (val) { |
|||
this.stepsActive = 1 |
|||
} else { |
|||
if (this.stepsActive == 3) { |
|||
//以下是重置数据 |
|||
this.stepsActive = 1 |
|||
this.stepList = [ |
|||
{ |
|||
icon: 'wk wk-upload', |
|||
title: '上传文件', |
|||
status: 'wait' |
|||
}, |
|||
{ |
|||
icon: 'wk wk-data-import', |
|||
title: '导入数据', |
|||
status: 'wait' |
|||
}, |
|||
{ |
|||
icon: 'wk wk-success', |
|||
title: '导入完成', |
|||
status: 'wait' |
|||
} |
|||
] |
|||
this.resultData = null |
|||
} |
|||
} |
|||
}, |
|||
|
|||
stepsActive() { |
|||
this.$emit( |
|||
"status", |
|||
{ |
|||
1: "wait", |
|||
2: "process", |
|||
3: "finish", |
|||
}[this.stepsActive] |
|||
); |
|||
}, |
|||
}, |
|||
mounted() {}, |
|||
methods: { |
|||
handleImportExcelClick() {//父组件中,初始化此子组件时调用 |
|||
this.fileuploadList = []; |
|||
//this.$refs.upload.clearFiles(); |
|||
}, |
|||
httpRequestfiles(data) { |
|||
let _this = this; |
|||
let rd = new FileReader(); // 创建文件读取对象 |
|||
let file = data.file; |
|||
this.fileuploadList.push(file); |
|||
rd.readAsDataURL(file); // 文件读取装换为base64类型 |
|||
}, |
|||
beforeAvatarUpload(file) { |
|||
var FileExt = file.name.replace(/.+\./, ""); |
|||
if (['xlsx'].indexOf(FileExt.toLowerCase()) === -1){ |
|||
this.$message({ |
|||
type: 'warning', |
|||
message: '只支持xlsx类型文件!' |
|||
}); |
|||
this.isFileType="0" |
|||
return false; |
|||
} |
|||
else{ |
|||
this.isFileType="1" |
|||
} |
|||
this.isLt2M = file.size / 1024 / 1024 < 2?'1':'0'; |
|||
if (this.isLt2M==="0") { |
|||
this.$message.error("上传文件大小不能超过 2MB!"); |
|||
} |
|||
return this.isLt2M==='1'?true: false; |
|||
}, |
|||
beforeRemove(file, fileList) { |
|||
if (this.isLt2M==="1" && this.isFileType==="1") { |
|||
return this.$confirm(`确定移除 ${ file.name }?`); |
|||
} |
|||
}, |
|||
handleRemove(file, fileList) {//附件列表删除操作 |
|||
const index=this.fileuploadList.indexOf(file.originFileObj) |
|||
const newFileList=this.fileuploadList.slice() |
|||
newFileList.splice(index,1) |
|||
this.fileuploadList = newFileList; |
|||
}, |
|||
//执行按钮 |
|||
sureClick() { |
|||
if (this.fileuploadList===[] || JSON.stringify(this.fileuploadList) === "[]") { |
|||
this.$message.error("请选择导入文件"); |
|||
return false; |
|||
} |
|||
if (this.stepsActive == 1) { |
|||
if (this.stepList[0].status == "wait") { |
|||
this.stepsActive = 2; |
|||
this.loading = true; |
|||
setTimeout(() => { |
|||
this.saveTemplateData(); |
|||
}, 2000) |
|||
if( this.stepList[1].status == 'finish') |
|||
{ |
|||
|
|||
} |
|||
} else { |
|||
if (this.fileuploadList === "[]") { |
|||
this.$message.error("请选择导入文件"); |
|||
} |
|||
} |
|||
} else { |
|||
this.closeView(); |
|||
} |
|||
}, |
|||
|
|||
saveTemplateData() {//保存项目、合同管理、客户等信息的共用方法 |
|||
//--上传附件,批量或拖拽 |
|||
if (JSON.stringify(this.fileuploadList) != "[]") { |
|||
let fd = new FormData(); |
|||
const{fileuploadList}=this; |
|||
fileuploadList.forEach(file=>{ |
|||
fd.append("files", file); // 添加文件 |
|||
}) |
|||
console.log("fd:"+JSON.stringify(fd)) |
|||
var request = { |
|||
uomGroup: winUomGroupExcelImport |
|||
}[this.crmType] |
|||
request(fd) |
|||
.then((res) => {//此处,导出模板上设置的错误 |
|||
this.loading = false; |
|||
this.resultData = res; |
|||
if(res.errSize>0 && res.errMessage==="RowErrors"){//上传有错误数据 && res.errMessage.length <= 0 |
|||
this.stepList[0].status = 'wait'; |
|||
this.resultData.errSize=res.errSize;//错误数据个数 |
|||
this.resultData.errTemplate=res.errTemplate;//指定错误模板名称,作为参数,用于错误模板下载 |
|||
this.stepsActive = 3; |
|||
} |
|||
else{ |
|||
if(res.errMessage.length > 0 && res.errMessage !="SccessData"){//此处,是判断数据库中是否匹配 |
|||
this.stepsActive = 4; |
|||
} |
|||
else { |
|||
this.stepList[1].status = 'finish' |
|||
this.resultData.totalSize=res.totalSize;//返回导入成功的数据总数 |
|||
if (this.isLt2M==="1" |
|||
&& this.isFileType==="1" |
|||
&& res.errMessage ==="SccessData" |
|||
&& res.totalSize>0) { |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "数据导入成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
} |
|||
this.stepsActive = 3; |
|||
} |
|||
} |
|||
this.$emit("save-success", { |
|||
type: this.crmType |
|||
}); |
|||
this.$emit('status', 'finish'); |
|||
}) |
|||
.catch(() => {this.loading = false;}); |
|||
} else { |
|||
this.loading = false; |
|||
this.$message({ |
|||
message: "未上传任何附件,请查检!", |
|||
type: "warning", |
|||
}); |
|||
} |
|||
}, |
|||
|
|||
/** |
|||
* 下载错误模板数据等(统一接口) |
|||
*/ |
|||
downloadErrData() { |
|||
var fileName=this.getImportTemplate; |
|||
this.$axios |
|||
.BolbGets("/api/basedataservice/exceltemplate/downloadExcelFiles/" + this.resultData.errTemplate) |
|||
.then((response) => { |
|||
downloadFile(response,fileName); |
|||
}); |
|||
}, |
|||
/** |
|||
* 生成模板,引入相关业务接口 |
|||
*/ |
|||
createTemplate(){ |
|||
var request = { |
|||
uomGroup: winUomGroupExcelImportTemplate |
|||
}[this.crmType] |
|||
//this.loading = true |
|||
request() |
|||
.then(res => { |
|||
result(res) |
|||
this.loading = false |
|||
this.$notify({ |
|||
title: "成功", |
|||
message: "模板生成成功!", |
|||
type: "success", |
|||
duration: 2000, |
|||
}); |
|||
}) |
|||
.catch(() => { |
|||
this.loading = false |
|||
}) |
|||
}, |
|||
// 下载模板操作)(统一接口) |
|||
download() { |
|||
var fileName=this.getImportTemplate; |
|||
this.loading = true |
|||
this.$axios |
|||
.BolbGets("/api/basedataservice/exceltemplate/downloadExcelTemplate/" + fileName) |
|||
.then((response) => { |
|||
downloadFile(response,fileName); |
|||
this.loading = false |
|||
}) |
|||
.catch(() => { |
|||
this.loading = false |
|||
}); |
|||
}, |
|||
// 关闭操作 |
|||
closeView() { |
|||
this.$emit("update:show", false); |
|||
this.$emit("close", this.stepsActive == 3 ? "finish" : ""); |
|||
} |
|||
|
|||
}, |
|||
}; |
|||
</script> |
|||
<style scoped lang="scss"> |
|||
@import '@/styles/xr-theme.scss'; |
|||
.el-steps { |
|||
margin-bottom: 15px; |
|||
|
|||
/deep/ .el-step__title { |
|||
font-size: 14px; |
|||
} |
|||
|
|||
/deep/ .el-step.is-simple .el-step__arrow::before, |
|||
/deep/ .el-step.is-simple .el-step__arrow::after { |
|||
height: 10px; |
|||
width: 2px; |
|||
} |
|||
|
|||
/deep/ .el-step.is-simple .el-step__arrow::after { |
|||
transform: rotate(45deg) translateY(3px); |
|||
} |
|||
/deep/ .el-step.is-simple .el-step__arrow::before { |
|||
transform: rotate(-45deg) translateY(-2px); |
|||
} |
|||
} |
|||
|
|||
.step-section { |
|||
min-height: 300px; |
|||
|
|||
/deep/ .el-loading-spinner { |
|||
top: 45%; |
|||
.el-icon-loading { |
|||
font-size: 40px; |
|||
color: #999; |
|||
} |
|||
|
|||
.el-loading-text { |
|||
color: #333; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.sections { |
|||
font-size: 14px; |
|||
color: #333; |
|||
|
|||
&__title { |
|||
font-weight: 600; |
|||
} |
|||
|
|||
&__tips { |
|||
padding-left: 30px; |
|||
margin: 8px 0 15px; |
|||
color: #999; |
|||
font-size: 12px; |
|||
line-height: 1.4; |
|||
} |
|||
|
|||
.download { |
|||
cursor: pointer; |
|||
color: #2362fb; |
|||
} |
|||
} |
|||
|
|||
.sections__tips + .content { |
|||
padding-top: 0; |
|||
|
|||
} |
|||
|
|||
.content { |
|||
padding: 10px 10px 10px 30px; |
|||
.el-select { |
|||
width: 400px; |
|||
} |
|||
.user-cell { |
|||
width: 400px; |
|||
} |
|||
} |
|||
|
|||
#importInputFile { |
|||
display: none; |
|||
} |
|||
|
|||
.file-select { |
|||
.el-input { |
|||
width: 400px; |
|||
} |
|||
button { |
|||
margin-left: 20px; |
|||
} |
|||
} |
|||
|
|||
.is-hidden { |
|||
visibility: hidden; |
|||
} |
|||
|
|||
.history-btn { |
|||
float: left; |
|||
margin-left: 15px; |
|||
} |
|||
|
|||
// 结果信息 |
|||
.result-info { |
|||
text-align: center; |
|||
padding-top: 50px; |
|||
|
|||
&__icon { |
|||
font-size: 40px; |
|||
color: $xr-color-primary; |
|||
} |
|||
|
|||
&__des { |
|||
margin-top: -15px; |
|||
color: #333; |
|||
font-size: 30px; |
|||
} |
|||
|
|||
&__detail { |
|||
margin-top: 35px; |
|||
font-size: 20px; |
|||
color: #666; |
|||
&--all { |
|||
color: #333; |
|||
font-weight: 600; |
|||
} |
|||
|
|||
&--suc { |
|||
color: $xr-color-primary; |
|||
font-weight: 600; |
|||
} |
|||
|
|||
&--err { |
|||
margin-top: 25px; |
|||
color: #f94e4e; |
|||
font-weight: 600; |
|||
} |
|||
} |
|||
|
|||
&__btn--err { |
|||
margin-top: 10px; |
|||
font-size: 20px; |
|||
} |
|||
} |
|||
</style> |
|||
|
|||
|
|||
|
@ -0,0 +1,266 @@ |
|||
<template> |
|||
<div class="c-container"> |
|||
<div class="title">{{ title }}</div> |
|||
<!-- <el-input |
|||
:placeholder="placeholder" |
|||
v-model="inputContent" |
|||
class="sc-container" |
|||
@input="inputChange" |
|||
@keyup.enter.native="searchInput" v-show="showSearch"> |
|||
<el-button |
|||
slot="append" |
|||
icon="el-icon-search" |
|||
@click.native="searchInput"/> |
|||
</el-input> --> |
|||
<div class="right-container"> |
|||
<el-button |
|||
size="small" |
|||
type="primary" |
|||
@click="createClick">{{ createTitle }}</el-button> |
|||
<el-dropdown |
|||
v-if="moreTypes.length > 0" |
|||
trigger="click" |
|||
@command="handleTypeDrop"> |
|||
<flexbox class="right-more-item"> |
|||
<div>更多</div> |
|||
<i |
|||
class="el-icon-arrow-down el-icon--right" |
|||
style="color:#777;"/> |
|||
</flexbox> |
|||
<el-dropdown-menu slot="dropdown"> |
|||
<el-dropdown-item |
|||
v-for="(item, index) in moreTypes" |
|||
:key="index" |
|||
:command="item.type">{{ item.name }}</el-dropdown-item> |
|||
</el-dropdown-menu> |
|||
</el-dropdown> |
|||
</div> |
|||
<c-r-m-create-view |
|||
v-if="isCreate" |
|||
:crm-type="createCRMType" |
|||
:action="createActionInfo" |
|||
@save-success="createSaveSuccess" |
|||
@hiden-view="hideView" |
|||
width='700px' |
|||
/> |
|||
<c-r-m-import |
|||
:show="showCRMImport" |
|||
:crm-type="crmType" |
|||
@save-success="createSaveSuccess" |
|||
@close="showCRMImport=false"/> |
|||
<c-r-m-export |
|||
:show="showCRMExport" |
|||
:crm-type="crmType" |
|||
:search="search" |
|||
:scene_id="scene_id" |
|||
:filter-obj="filterObj" |
|||
:export-params="exportParams" |
|||
@close="showCRMExport=false"/> |
|||
</div> |
|||
</template> |
|||
|
|||
<script type="text/javascript"> |
|||
import { mapGetters } from 'vuex' |
|||
import CRMCreateView from './CRMCreateView' |
|||
import CRMImport from './CRMImport' |
|||
import CRMExport from './CRMExport' |
|||
import crmTypes from "../../../../static/crmTypes"; |
|||
|
|||
export default { |
|||
name: 'CRMListHead', // 客户管理下 重要提醒 回款计划提醒 |
|||
components: { |
|||
CRMCreateView, |
|||
CRMImport, |
|||
CRMExport |
|||
}, |
|||
props: { |
|||
showSearch:{ |
|||
type: Boolean, |
|||
default: true |
|||
}, |
|||
|
|||
// CRM类型 |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
search: String, |
|||
scene_id: { |
|||
type: [Number, String], |
|||
default: '' |
|||
}, |
|||
filterObj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {} |
|||
} |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
title: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
placeholder: { |
|||
type: String, |
|||
default: '请输入内容' |
|||
}, |
|||
createTitle: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
inputContent: '', |
|||
/** 更多操作 */ |
|||
moreTypes: [], |
|||
// 创建的相关信息 |
|||
createActionInfo: { type: 'create' }, |
|||
createCRMType: '', |
|||
isCreate: false, // 是创建 |
|||
// 导入 |
|||
showCRMImport: false, |
|||
// 导出 |
|||
showCRMExport: false, |
|||
// 导出选中参数 |
|||
exportParams: {} |
|||
} |
|||
}, |
|||
computed: { |
|||
// ...mapGetters(['crm']), |
|||
// canSave() { |
|||
// if (this.isSeas) { |
|||
// return false |
|||
// } |
|||
// return this.crm[this.crmType].save |
|||
// } |
|||
}, |
|||
mounted() { |
|||
// 线索和客户判断更多操作 |
|||
|
|||
this.getTitle(); |
|||
if (!this.isSeas) { |
|||
//if (this.crm[this.crmType].excelimport) { |
|||
this.moreTypes.push({ type: 'enter', name: '导入' }) |
|||
//} |
|||
//if (this.crm[this.crmType].excelexport) { |
|||
this.moreTypes.push({ type: 'out', name: '导出全部' }) |
|||
// } |
|||
} else { |
|||
// 客户池的导出关键字不同 |
|||
//if (this.crm.pool.excelexport) { |
|||
this.moreTypes.push({ type: 'out', name: '导出全部' }) |
|||
// } |
|||
} |
|||
}, |
|||
methods: { |
|||
getTitle() { |
|||
let type=crmTypes[this.crmType]; |
|||
if(type===undefined) |
|||
{ |
|||
this.title=this.crmType+'管理'; |
|||
this.createTitle='新增'+this.crmType; |
|||
} |
|||
else |
|||
{ |
|||
this.title= type.name+'管理' |
|||
this.createTitle='新增'+type.name; |
|||
} |
|||
}, |
|||
|
|||
handleTypeDrop(command, params = {}) { |
|||
if (command == 'out') { |
|||
let paramsData = {} |
|||
if (params.__export) { |
|||
paramsData = params |
|||
delete paramsData.__export |
|||
} else { |
|||
paramsData = {} |
|||
} |
|||
this.exportParams = paramsData |
|||
this.showCRMExport = true |
|||
} else if (command == 'enter') { |
|||
this.showCRMImport = true |
|||
} |
|||
}, |
|||
createClick() { |
|||
|
|||
this.createCRMType = this.crmType |
|||
this.createActionInfo = { type: 'save' } |
|||
this.isCreate = !this.isCreate |
|||
}, |
|||
inputChange() { |
|||
this.$emit('update:search', this.inputContent) |
|||
}, |
|||
// 进行搜索操作 |
|||
searchInput() { |
|||
this.$emit('on-search', this.inputContent) |
|||
}, |
|||
// 创建数据页面 保存成功 |
|||
createSaveSuccess(data) { |
|||
if (data && data.saveAndCreate) { |
|||
if (data.type == 'customer') { |
|||
this.createCRMType = 'contacts' |
|||
this.createActionInfo = { |
|||
type: 'relative', |
|||
crmType: 'customer', |
|||
data: {} |
|||
} |
|||
this.createActionInfo.data['customer'] = data.data |
|||
this.isCreate = true |
|||
} |
|||
} else { |
|||
// 回到保存成功 |
|||
this.$emit('on-handle', { type: 'save-success' }) |
|||
} |
|||
}, |
|||
hideView() { |
|||
this.isCreate = false |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style lang="scss" scoped> |
|||
.c-container { |
|||
height: 60px; |
|||
position: relative; |
|||
z-index: 100; |
|||
.title { |
|||
float: left; |
|||
padding: 0 20px; |
|||
font-size: 18px; |
|||
line-height: 60px; |
|||
} |
|||
.sc-container { |
|||
width: 300px; |
|||
margin: -18px 0 0 -150px; |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
} |
|||
|
|||
.right-container { |
|||
margin-right: -10px; |
|||
float: right; |
|||
margin: 12px 20px 0 0; |
|||
position: relative; |
|||
.right-item { |
|||
float: left; |
|||
margin-right: 10px; |
|||
padding: 8px 10px; |
|||
font-size: 13px; |
|||
border-radius: 2px; |
|||
} |
|||
|
|||
.right-more-item { |
|||
cursor: pointer; |
|||
border: 1px solid #dcdfe6; |
|||
background-color: white; |
|||
font-size: 13px; |
|||
color: #777; |
|||
padding: 0 12px; |
|||
border-radius: 2px; |
|||
height: 31px; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,399 @@ |
|||
<template> |
|||
<div> |
|||
<flexbox v-show="selectionList.length == 0" class="th-container"> |
|||
<!-- <div v-if="!isSeas">场景:</div> |
|||
<div @click="getAllClick" class="condition_title"> |
|||
{{ sceneData.name || getDefaultSceneName() }} |
|||
</div> --> |
|||
<img |
|||
:style="{ 'margin-left': isSeas ? 0 : '30px' }" |
|||
class="c-filtrate" |
|||
src="@/assets/img/c_filtrate.png" |
|||
@click="showFilterClick" |
|||
/> |
|||
<div class="condition_title" @click="showFilterClick">高级筛选</div> |
|||
<filter-form |
|||
:field-list="fieldList" |
|||
:dialog-visible.sync="showFilter" |
|||
:obj="filterObj" |
|||
:crm-type="crmType" |
|||
:is-seas="isSeas" |
|||
@filter="handleFilter" |
|||
/> |
|||
</flexbox> |
|||
|
|||
<scene-set |
|||
:dialog-visible.sync="showSceneSet" |
|||
:crm-type="crmType" |
|||
@save-success="updateSceneList" |
|||
/> |
|||
<scene-create |
|||
:field-list="fieldList" |
|||
:crm-type="crmType" |
|||
:dialog-visible.sync="showSceneCreate" |
|||
:obj="sceneFilterObj" |
|||
@saveSuccess="updateSceneList" |
|||
/> |
|||
</div> |
|||
</template> |
|||
|
|||
<script type="text/javascript"> |
|||
import { mapGetters } from "vuex"; |
|||
import crmTypeModel from "@/views/ux/model/crmTypeModel"; |
|||
//获取表格列 |
|||
import { |
|||
filterIndexfields, |
|||
// crmSceneSave |
|||
} from "@/api/ux/common"; |
|||
|
|||
import filterForm from "./filterForm"; |
|||
import filterContent from "./filterForm/filterContent"; |
|||
import SceneSet from "./sceneForm/SceneSet"; // 场景设置 |
|||
import SceneCreate from "./sceneForm/SceneCreate"; |
|||
import data from "../../../../static/tableFieldForSearch"; |
|||
import crmtypes from "../../../../static/crmTypes"; |
|||
|
|||
export default { |
|||
name: "CRMTableHead", // 客户管理下 重要提醒 回款计划提醒 |
|||
components: { |
|||
filterForm, |
|||
filterContent, |
|||
SceneCreate, |
|||
SceneSet, |
|||
}, |
|||
props: { |
|||
title: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
/** 没有值就是全部类型 有值就是当个类型 */ |
|||
crmType: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
// 辅助 使用 公海没有场景 |
|||
isSeas: { |
|||
type: Boolean, |
|||
default: false, |
|||
}, |
|||
//父ID,主要用于批量删除 |
|||
parentID: { |
|||
type: String, |
|||
default: "", |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
sceneTypes: [ |
|||
{ type: "enter", name: "我负责的" }, |
|||
{ type: "out", name: "我" }, |
|||
], |
|||
sceneType: null, |
|||
showScene: false, // 场景操作 |
|||
showFilter: false, // 控制筛选框 |
|||
fieldList: [], |
|||
filterObj: { form: [] }, // 筛选确定数据 |
|||
|
|||
sceneData: { id: "", bydata: "", name: "" }, |
|||
showSceneSet: false, // 展示场景设置 |
|||
showSceneCreate: false, // 展示场景添加 |
|||
sceneFilterObj: { form: [] }, // 筛选确定数据 |
|||
|
|||
/** 勾选操作数据 */ |
|||
selectionList: [], |
|||
transferDialogShow: false, |
|||
teamsDialogShow: false, // 团队操作提示框 |
|||
teamsTitle: "", // 团队操作标题名 |
|||
allocDialogShow: false, // 公海分配操作提示框 |
|||
dealStatusShow: false, // 成交状态修改框 |
|||
crmTypes: {}, |
|||
}; |
|||
}, |
|||
computed: {}, |
|||
watch: {}, |
|||
mounted() {}, |
|||
methods: { |
|||
/** 发布 时候的类型选择 */ |
|||
handleTypeDrop(command) { |
|||
this.sceneType = command; |
|||
}, |
|||
/** 搜索全部 */ |
|||
getAllClick() { |
|||
//清空搜索条件 |
|||
this.filterObj = { form: [] }; |
|||
this.$emit("filter", null); |
|||
}, |
|||
/** 展示高级筛选 */ |
|||
showFilterClick() { |
|||
this.getFilterFieldInfo(); |
|||
}, |
|||
// 获取高级筛选字段数据 |
|||
getFilterFieldInfo() { |
|||
this.fieldList = data[this.crmType].data; |
|||
this.showFilter = true; |
|||
}, |
|||
handleFilter(form) { |
|||
this.showFilter = false; |
|||
if (form === null) { |
|||
this.$emit("filter", null); |
|||
} else { |
|||
this.filterObj = form; |
|||
this.showFilter = false; |
|||
if (form.saveChecked) { |
|||
crmSceneSave({ |
|||
type: crmTypeModel[this.crmType], |
|||
isDefault: form.saveDefault ? 1 : 0, |
|||
name: form.saveName, |
|||
data: JSON.stringify(form.obj), |
|||
}) |
|||
.then((res) => { |
|||
this.updateSceneList(); |
|||
}) |
|||
.catch(() => {}); |
|||
} |
|||
this.$emit("filter", form.obj); |
|||
//this.$emit('filter', form.form) |
|||
} |
|||
}, |
|||
//清空条件 |
|||
handleClearField() { |
|||
this.filterObj = data.obj; |
|||
}, |
|||
// 场景操作 |
|||
/** 选择了场景 */ |
|||
sceneSelect(data) { |
|||
this.sceneData = data; |
|||
this.$emit("scene", data); |
|||
}, |
|||
sceneHandle(data) { |
|||
if (data.type == "set") { |
|||
this.showSceneSet = true; |
|||
} else if (data.type == "add") { |
|||
filterIndexfields({ |
|||
label: crmTypeModel[this.crmType], |
|||
}) |
|||
.then((res) => { |
|||
this.fieldList = res.data; |
|||
this.showSceneCreate = true; |
|||
}) |
|||
.catch(() => {}); |
|||
} |
|||
}, |
|||
/** 创建保存成功 */ |
|||
updateSceneList() { |
|||
this.$refs.sceneList.getSceneList(); |
|||
}, |
|||
/** 勾选后的表头操作 */ |
|||
headSelectionChange(array) { |
|||
this.selectionList = array; |
|||
}, |
|||
/** 操作 */ |
|||
selectionBarClick(type) { |
|||
var message = ""; |
|||
if (type == "export") { |
|||
message = "确定要导出这些数据嘛?"; |
|||
} else if (type == "delete") { |
|||
message = "确定要删除这些数据嘛?"; |
|||
} |
|||
this.$confirm(message, "提示", { |
|||
confirmButtonText: "确定", |
|||
cancelButtonText: "取消", |
|||
type: "warning", |
|||
}) |
|||
.then(() => { |
|||
this.confirmHandle(type); |
|||
}) |
|||
.catch(() => { |
|||
this.$message({ |
|||
type: "info", |
|||
message: "已取消操作", |
|||
}); |
|||
}); |
|||
}, |
|||
|
|||
confirmHandle(type) { |
|||
if (type === "export") { |
|||
this.handleExport(); |
|||
} |
|||
}, |
|||
handleExport() { |
|||
const params = {}; |
|||
params["ids"] = this.selectionList |
|||
.map((item) => { |
|||
return item[this.crmType + "Id"]; |
|||
}) |
|||
.join(","); |
|||
params.__export = true; |
|||
this.$emit("exportData", params); |
|||
}, |
|||
|
|||
deleteItemsCallBack() { |
|||
this.$message({ |
|||
type: "success", |
|||
message: "删除成功", |
|||
}); |
|||
this.$emit("handle", { type: "delete" }); |
|||
}, |
|||
/** 获取展示items */ |
|||
getSelectionHandleItemsInfo() { |
|||
const handleInfos = { |
|||
export: { |
|||
name: "导出选中", |
|||
type: "export", |
|||
icon: require("@/assets/img/selection_export.png"), |
|||
}, |
|||
delete: { |
|||
name: "批量删除", |
|||
type: "delete", |
|||
icon: require("@/assets/img/selection_delete.png"), |
|||
}, |
|||
}; |
|||
|
|||
return this.forSelectionHandleItems(handleInfos, ["export", "delete"]); |
|||
}, |
|||
forSelectionHandleItems(handleInfos, array) { |
|||
var tempsHandles = []; |
|||
for (let index = 0; index < array.length; index++) { |
|||
tempsHandles.push(handleInfos[array[index]]); |
|||
} |
|||
return tempsHandles; |
|||
}, |
|||
// 判断是否展示 |
|||
whetherTypeShowByPermision: function (type) { |
|||
if (type == "transfer") { |
|||
return this.sceneData.bydata == "transform" |
|||
? false |
|||
: this.crm[this.crmType].transfer; |
|||
} else if (type == "transform") { |
|||
return this.sceneData.bydata == "transform" |
|||
? false |
|||
: this.crm[this.crmType].transform; |
|||
} else if (type == "export") { |
|||
if (this.isSeas) { |
|||
return this.crm.pool.excelexport; |
|||
} |
|||
return this.crm[this.crmType].excelexport; |
|||
} else if (type == "delete") { |
|||
return this.crm[this.crmType].delete; |
|||
} else if (type == "put_seas") { |
|||
// 放入公海(客户) |
|||
return this.crm[this.crmType].putinpool; |
|||
} else if (type == "lock" || type == "unlock") { |
|||
// 锁定解锁(客户) |
|||
return ( |
|||
this.crm[this.crmType].lock && this.CRMConfig.customerConfig == 1 |
|||
); |
|||
} else if (type == "add_user" || type == "delete_user") { |
|||
// 添加 移除团队成员 |
|||
return this.crm[this.crmType].teamsave; |
|||
} else if (type == "alloc") { |
|||
// 分配(公海) |
|||
return this.crm.pool.distribute; |
|||
} else if (type == "get") { |
|||
// 领取(公海) |
|||
return this.crm.pool.receive; |
|||
} else if (type == "start") { |
|||
// 上架 下架(产品) |
|||
for (let index = 0; index < this.selectionList.length; index++) { |
|||
const element = this.selectionList[index]; |
|||
if (element.是否上下架 == "上架") { |
|||
return false; |
|||
} |
|||
} |
|||
return this.crm[this.crmType].status; |
|||
} else if (type == "disable") { |
|||
// 上架 下架(产品) |
|||
for (let index = 0; index < this.selectionList.length; index++) { |
|||
const element = this.selectionList[index]; |
|||
if (element.是否上下架 == "下架") { |
|||
return false; |
|||
} |
|||
} |
|||
return this.crm[this.crmType].status; |
|||
} else if (type == "deal_status") { |
|||
// 客户状态修改 |
|||
return this.crm[this.crmType].dealStatus; |
|||
} |
|||
return true; |
|||
}, |
|||
// 子组件 回调的 结果 |
|||
handleCallBack(data) { |
|||
this.$emit("handle", { type: data.type }); |
|||
}, |
|||
// 获取默认场景名字 |
|||
getDefaultSceneName() { |
|||
//add-场景 |
|||
this.crmTypes = crmtypes; |
|||
let type = this.crmTypes[this.crmType]; |
|||
if (type === undefined) { |
|||
return "全部" + this.crmType; |
|||
} else { |
|||
return "全部" + type.name; |
|||
} |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
<style lang="scss" scoped> |
|||
@import "../../../styles/xr-theme"; |
|||
.th-container { |
|||
font-size: 13px; |
|||
height: 50px; |
|||
padding: 0 20px; |
|||
} |
|||
/** 场景和筛选 */ |
|||
.condition_title { |
|||
cursor: pointer; |
|||
} |
|||
.condition_title:hover { |
|||
color: $xr-color-primary; |
|||
} |
|||
|
|||
.m-arrow { |
|||
margin: 0 8px; |
|||
} |
|||
.c-filtrate { |
|||
margin: 0 10px 0 30px; |
|||
width: 12px; |
|||
} |
|||
|
|||
/** 勾选操作 */ |
|||
.selection-bar { |
|||
font-size: 12px; |
|||
height: 50px; |
|||
padding: 0 20px; |
|||
color: #777; |
|||
|
|||
.selected—title { |
|||
flex-shrink: 0; |
|||
padding-right: 20px; |
|||
border-right: 1px solid $--table-border-color; |
|||
.selected—count { |
|||
color: $xr-color-primary; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.selection-items-box { |
|||
overflow-x: auto; |
|||
overflow-y: hidden; |
|||
.selection-item { |
|||
width: auto; |
|||
padding: 15px; |
|||
flex-shrink: 0; |
|||
.selection-item-icon { |
|||
display: block; |
|||
margin-right: 5px; |
|||
width: 15px; |
|||
height: 15px; |
|||
} |
|||
.selection-item-name { |
|||
cursor: pointer; |
|||
color: #777; |
|||
} |
|||
.selection-item-name:hover { |
|||
color: $xr-color-primary; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,601 @@ |
|||
<template> |
|||
<div class="mix-container"> |
|||
<div class="i-cont"> |
|||
<el-input |
|||
ref="textarea" |
|||
v-model="content" |
|||
:autosize="inputAutosize" |
|||
type="textarea" |
|||
clearable |
|||
resize="none" |
|||
placeholder="请输入内容" |
|||
@focus="inputFocus"/> |
|||
</div> |
|||
<section |
|||
v-if="imgFiles.length > 0" |
|||
class="img-cont"> |
|||
<flexbox wrap="wrap"> |
|||
<div |
|||
v-for="(item, index) in imgFiles" |
|||
:key="index" |
|||
:style="{ 'background-image': 'url('+item.url+')' }" |
|||
class="img-item" |
|||
@mouseover="mouseImgOver(item, index)" |
|||
@mouseleave="mouseImgLeave(item, index)"> |
|||
<div |
|||
v-if="item.showDelete" |
|||
class="img-delete" |
|||
@click="deleteImgOrFile('image', item, index)">×</div> |
|||
</div> |
|||
<div class="img-item-add"> |
|||
<input |
|||
type="file" |
|||
class="img-item-iput" |
|||
accept="image/*" |
|||
multiple |
|||
@change="uploadFile"> |
|||
</div> |
|||
</flexbox> |
|||
<div |
|||
class="img-bar" |
|||
@click="deleteAllImg">全部删除</div> |
|||
</section> |
|||
<section |
|||
v-if="files.length > 0" |
|||
class="file-cont"> |
|||
<flexbox class="f-header"> |
|||
<img |
|||
class="f-logo" |
|||
src="@/assets/img/send_file.png"> |
|||
<div class="f-name">附件</div> |
|||
</flexbox> |
|||
<div class="f-body"> |
|||
<flexbox |
|||
v-for="(item, index) in files" |
|||
:key="index" |
|||
class="f-item"> |
|||
<img |
|||
:src="item.icon" |
|||
class="f-img"> |
|||
<div class="f-name">{{ item.name+'('+item.size+')' }}</div> |
|||
<div |
|||
class="close-button" |
|||
@click="deleteImgOrFile('file', item, index)">×</div> |
|||
</flexbox> |
|||
</div> |
|||
<div |
|||
class="img-bar" |
|||
@click="files=[]">全部删除</div> |
|||
</section> |
|||
<section |
|||
v-if="business.length > 0" |
|||
class="c-cont"> |
|||
<flexbox class="c-header"> |
|||
<img |
|||
class="c-logo" |
|||
src="@/assets/img/send_business.png"> |
|||
<div class="c-name">商机</div> |
|||
</flexbox> |
|||
<div class="c-body"> |
|||
<flexbox wrap="wrap"> |
|||
<flexbox |
|||
v-for="(item, index) in business" |
|||
:key="index" |
|||
class="c-item"> |
|||
<div class="c-item-name">{{ item.businessName }}</div> |
|||
<div |
|||
class="c-item-close" |
|||
@click="business.splice(index, 1)">×</div> |
|||
</flexbox> |
|||
</flexbox> |
|||
</div> |
|||
</section> |
|||
<section |
|||
v-if="contacts.length > 0" |
|||
class="c-cont"> |
|||
<flexbox class="c-header"> |
|||
<img |
|||
class="c-logo" |
|||
src="@/assets/img/send_contacts.png"> |
|||
<div class="c-name">联系人</div> |
|||
</flexbox> |
|||
<div class="c-body"> |
|||
<flexbox wrap="wrap"> |
|||
<flexbox |
|||
v-for="(item, index) in contacts" |
|||
:key="index" |
|||
class="c-item"> |
|||
<div class="c-item-name">{{ item.name }}</div> |
|||
<div |
|||
class="c-item-close" |
|||
@click="contacts.splice(index, 1)">×</div> |
|||
</flexbox> |
|||
</flexbox> |
|||
</div> |
|||
</section> |
|||
<flexbox class="bar-cont"> |
|||
<template v-for="(item, index) in barItems"> |
|||
<flexbox |
|||
v-if="item.type=='img'||item.type=='file'" |
|||
:key="index" |
|||
class="bar-item" |
|||
@click.native="barClick(item)"> |
|||
<input |
|||
:accept="item.data" |
|||
type="file" |
|||
class="bar-input" |
|||
multiple |
|||
@change="uploadFile"> |
|||
<img |
|||
:src="item.img" |
|||
class="bar-img"> |
|||
<div class="bar-title">{{ item.title }}</div> |
|||
</flexbox> |
|||
<el-popover |
|||
v-else |
|||
:key="index" |
|||
v-model="item.show" |
|||
placement="bottom" |
|||
width="700" |
|||
popper-class="no-padding-popover" |
|||
trigger="click"> |
|||
<!-- <crm-relative--> |
|||
<!-- ref="crmrelative"--> |
|||
<!-- :show="item.show"--> |
|||
<!-- :radio="false"--> |
|||
<!-- :action="{ type: 'condition', data: { moduleType: crmType, customerId: id } }"--> |
|||
<!-- :selected-data="item.type == 'business' ? { 'business': business } : { 'contacts': contacts }"--> |
|||
<!-- :crm-type="item.type"--> |
|||
<!-- @close="item.show=false"--> |
|||
<!-- @changeCheckout="checkRelativeInfos"/>--> |
|||
<flexbox |
|||
slot="reference" |
|||
class="bar-item" |
|||
@click.native="barClick(item)"> |
|||
<img |
|||
:src="item.img" |
|||
class="bar-img"> |
|||
<div class="bar-title">{{ item.title }}</div> |
|||
</flexbox> |
|||
</el-popover> |
|||
</template> |
|||
</flexbox> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
// import { fileSize, getFileTypeIcon } from '@/utils/index' |
|||
// import { crmFileSave, crmFileDelete } from '@/api/common' |
|||
// import CrmRelative from '@/components/CreateCom/CrmRelative' |
|||
|
|||
export default { |
|||
/** 跟进记录 下的 添加 有添加框的都需要*/ |
|||
name: 'MixAdd', |
|||
components: { |
|||
// CrmRelative |
|||
}, |
|||
props: { |
|||
/** 展示相关商机关联 */ |
|||
showRelativeBusiness: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
/** 展示相关商机关联 */ |
|||
showRelativeContacts: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
/** 模块ID */ |
|||
id: [String, Number], |
|||
/** 没有值就是全部类型 有值就是当个类型 */ |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
/** 输入法 */ |
|||
content: '', |
|||
inputAutosize: { minRows: 1, maxRows: 6 }, // 默认1 聚焦是 变成3 |
|||
/** 快捷添加 */ |
|||
barItems: [ |
|||
{ |
|||
img: require('@/assets/img/send_img.png'), |
|||
title: '图片', |
|||
type: 'img', |
|||
data: 'image/*' |
|||
}, |
|||
{ |
|||
img: require('@/assets/img/send_file.png'), |
|||
title: '附件', |
|||
type: 'file', |
|||
data: '*.*' |
|||
} |
|||
], |
|||
/** 图片信息 */ |
|||
imgFiles: [], |
|||
/** 图片信息 */ |
|||
files: [], |
|||
/** 关联商机信息 */ |
|||
business: [], |
|||
/** 关联联系人信息 */ |
|||
contacts: [], |
|||
/** 展示关联弹窗 */ |
|||
showRelativeType: '', |
|||
batchId: '' // 批次ID |
|||
} |
|||
}, |
|||
computed: {}, |
|||
mounted() { |
|||
/** 控制展示关联商机 和 联系人 */ |
|||
if (this.showRelativeBusiness) { |
|||
this.barItems.push({ |
|||
img: require('@/assets/img/send_business.png'), |
|||
title: '关联商机', |
|||
type: 'business', |
|||
show: false |
|||
}) |
|||
} |
|||
|
|||
if (this.showRelativeContacts) { |
|||
this.barItems.push({ |
|||
img: require('@/assets/img/send_contacts.png'), |
|||
title: '关联联系人', |
|||
type: 'contacts', |
|||
show: false |
|||
}) |
|||
} |
|||
/** 父组件通知子组件提交数据 */ |
|||
/** 将拼接好的数据回调父组件 this.$refs.child.$emit('submit-info'); 调用*/ |
|||
this.$on('submit-info', function() { |
|||
this.$emit('mixadd-info', { |
|||
content: this.content, |
|||
files: this.files, |
|||
images: this.imgFiles, |
|||
business: this.business, |
|||
contacts: this.contacts, |
|||
batchId: this.batchId |
|||
}) |
|||
}) |
|||
}, |
|||
|
|||
beforeDestroy() { |
|||
this.$off('submit-info') |
|||
}, |
|||
methods: { |
|||
resetInfo() { |
|||
/** 输入法 */ |
|||
this.content = '' |
|||
/** 图片信息 */ |
|||
this.imgFiles = [] |
|||
/** 图片信息 */ |
|||
this.files = [] |
|||
/** 关联商机信息 */ |
|||
this.business = [] |
|||
/** 关联联系人信息 */ |
|||
this.contacts = [] |
|||
/** 展示关联弹窗 */ |
|||
this.showRelativeType = '' |
|||
this.batchId = '' |
|||
}, |
|||
/** 快捷添加按钮 */ |
|||
checkRelativeInfos(data) { |
|||
if (this.showRelativeType == 'business') { |
|||
this.business = data.data |
|||
} else if (this.showRelativeType == 'contacts') { |
|||
this.contacts = data.data |
|||
} |
|||
}, |
|||
barClick(item) { |
|||
this.showRelativeType = item.type |
|||
if (item.type == 'business') { |
|||
item.show = true |
|||
} else if (item.type == 'contacts') { |
|||
item.show = true |
|||
} |
|||
}, |
|||
/** 图片选择出发 */ |
|||
uploadFile(event) { |
|||
var files = event.target.files |
|||
if (files.length) { |
|||
for (let index = 0; index < files.length; index++) { |
|||
const file = files[index] |
|||
if ( |
|||
file.type.indexOf('image') == -1 && |
|||
this.showRelativeType == 'img' |
|||
) { |
|||
this.$message.error('请上传正确的文件类型') |
|||
return |
|||
} |
|||
} |
|||
|
|||
var type = event.target.accept == 'image/*' ? 'img' : 'file' |
|||
var firstFile = files[0] |
|||
this.sendFileRequest(firstFile, type, () => { |
|||
for (let index = 1; index < files.length; index++) { |
|||
const file = files[index] |
|||
this.sendFileRequest(file, type) |
|||
} |
|||
event.target.value = '' |
|||
}) |
|||
} |
|||
}, |
|||
// 发送请求 |
|||
sendFileRequest(file, type, result) { |
|||
var params = { file: file, type: type } |
|||
if (this.batchId) { |
|||
params.batchId = this.batchId |
|||
} |
|||
crmFileSave(params) |
|||
.then(res => { |
|||
if (this.batchId == '') { |
|||
this.batchId = res.batchId |
|||
} |
|||
res.size = fileSize(file.size) |
|||
if (type == 'img') { |
|||
this.imgFiles.push(res) |
|||
} else { |
|||
res['icon'] = getFileTypeIcon(file) |
|||
this.files.push(res) |
|||
} |
|||
if (result) { |
|||
result() |
|||
} |
|||
}) |
|||
.catch(() => {}) |
|||
}, |
|||
/** 删除全部图片 */ |
|||
deleteAllImg() { |
|||
this.imgFiles = [] |
|||
}, |
|||
deleteImgOrFile(type, item, index) { |
|||
crmFileDelete({ |
|||
id: item.fileId |
|||
}) |
|||
.then(res => { |
|||
if (type == 'image') { |
|||
this.imgFiles.splice(index, 1) |
|||
} else { |
|||
this.files.splice(index, 1) |
|||
} |
|||
this.$message.success('操作成功') |
|||
}) |
|||
.catch(() => {}) |
|||
}, |
|||
/** 鼠标移入和移除 图片区域 */ |
|||
mouseImgOver(item, index) { |
|||
item.showDelete = true |
|||
this.$set(this.imgFiles, index, item) |
|||
}, |
|||
mouseImgLeave(item, index) { |
|||
item.showDelete = false |
|||
this.$set(this.imgFiles, index, item) |
|||
}, |
|||
inputFocus() { |
|||
this.inputAutosize = { minRows: 3, maxRows: 6 } |
|||
this.$nextTick(() => { |
|||
this.$refs.textarea.resizeTextarea() |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.mix-container { |
|||
position: relative; |
|||
border: 1px solid #e6e6e6; |
|||
border-radius: 3px; |
|||
.i-cont { |
|||
padding: 8px 10px; |
|||
} |
|||
} |
|||
|
|||
.i-cont /deep/ .el-textarea__inner { |
|||
border: none; |
|||
padding: 0; |
|||
} |
|||
/** 图片 */ |
|||
.img-cont { |
|||
padding: 0 10px; |
|||
margin-bottom: 15px; |
|||
.img-item { |
|||
width: 98px; |
|||
height: 98px; |
|||
border: 1px solid #ccc; |
|||
display: inline-block; |
|||
margin: 0 4px 4px 0; |
|||
background-size: contain; |
|||
background-repeat: no-repeat; |
|||
background-position: center; |
|||
position: relative; |
|||
.img-delete { |
|||
position: absolute; |
|||
cursor: pointer; |
|||
top: 0; |
|||
right: 0; |
|||
width: 20px; |
|||
height: 20px; |
|||
line-height: 20px; |
|||
text-align: center; |
|||
font-size: 17px; |
|||
background-color: #666; |
|||
color: white; |
|||
} |
|||
} |
|||
.img-item-add { |
|||
width: 98px; |
|||
height: 98px; |
|||
line-height: 98px; |
|||
font-size: 60px; |
|||
color: #ccc; |
|||
text-align: center; |
|||
margin: 0 4px 4px 0; |
|||
cursor: pointer; |
|||
display: inline-block; |
|||
border-width: 1px; |
|||
border-style: dashed; |
|||
border-color: #ddd; |
|||
position: relative; |
|||
font-weight: 100; |
|||
.img-item-iput { |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; |
|||
height: 98px; |
|||
width: 98px; |
|||
opacity: 0; |
|||
cursor: pointer; |
|||
} |
|||
} |
|||
.img-item-add:before { |
|||
width: 2px; |
|||
height: 39.5px; |
|||
content: ' '; |
|||
position: absolute; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
background-color: #2888e4; |
|||
} |
|||
.img-item-add:after { |
|||
width: 39.5px; |
|||
height: 2px; |
|||
content: ' '; |
|||
position: absolute; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
background-color: #2888e4; |
|||
} |
|||
.img-bar { |
|||
color: #5a8ae2; |
|||
font-size: 12px; |
|||
padding: 5px 0; |
|||
cursor: pointer; |
|||
} |
|||
} |
|||
/** 附件 */ |
|||
.file-cont { |
|||
padding: 0 10px; |
|||
margin: 0 10px 15px; |
|||
border: 1px dashed #dfdfdf; |
|||
.f-header { |
|||
padding: 8px 0 15px; |
|||
.f-logo { |
|||
position: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
margin-right: 8px; |
|||
} |
|||
.f-name { |
|||
color: #777; |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
|
|||
.f-body { |
|||
.f-item { |
|||
padding: 3px 0; |
|||
height: 25px; |
|||
.f-img { |
|||
position: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
margin-right: 8px; |
|||
} |
|||
.f-name { |
|||
color: #666; |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.img-bar { |
|||
color: #5a8ae2; |
|||
font-size: 12px; |
|||
padding: 5px 0; |
|||
} |
|||
} |
|||
/** CRM */ |
|||
.c-cont { |
|||
padding: 0 10px; |
|||
margin: 0 10px 15px; |
|||
border: 1px dashed #dfdfdf; |
|||
.c-header { |
|||
padding: 8px 0 15px; |
|||
.c-logo { |
|||
position: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
margin-right: 8px; |
|||
} |
|||
.c-name { |
|||
color: #777; |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
|
|||
.c-body { |
|||
margin-bottom: 10px; |
|||
.c-item { |
|||
height: 24px; |
|||
border-radius: 12px; |
|||
padding: 0 8px; |
|||
margin: 0 5px 5px 0; |
|||
background-color: #3487e2; |
|||
color: white; |
|||
width: auto; |
|||
.c-item-name { |
|||
font-size: 12px; |
|||
} |
|||
.c-item-close { |
|||
padding-left: 5px; |
|||
font-size: 17px; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
/** 底部bar */ |
|||
.bar-cont { |
|||
background-color: #f9f9f9; |
|||
padding: 8px 15px; |
|||
.bar-item { |
|||
width: auto; |
|||
padding-right: 20px; |
|||
position: relative; |
|||
cursor: pointer; |
|||
.bar-input { |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; |
|||
height: 15px; |
|||
width: 68px; |
|||
opacity: 0; |
|||
font-size: 0; |
|||
cursor: pointer; |
|||
} |
|||
.bar-img { |
|||
display: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
margin-right: 8px; |
|||
} |
|||
.bar-title { |
|||
color: #777; |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
} |
|||
/** 关闭按钮 */ |
|||
.close-button { |
|||
width: 30px; |
|||
line-height: 16px; |
|||
cursor: pointer; |
|||
color: #ccc; |
|||
height: 16px; |
|||
font-size: 17px; |
|||
text-align: center; |
|||
} |
|||
</style> |
File diff suppressed because it is too large
@ -0,0 +1,144 @@ |
|||
<template> |
|||
<div class="section"> |
|||
<div |
|||
v-if="title && title.length > 0" |
|||
class="section-header"> |
|||
<div |
|||
:style="{ 'border-left-color': mColor }" |
|||
class="section-mark"/> |
|||
<div class="section-title">{{ title }}</div> |
|||
<flexbox |
|||
v-if="showF" |
|||
class="f-container"> |
|||
<div |
|||
v-for="(item, index) in fItems" |
|||
:key="index" |
|||
:class="{ 'f-item-select':fIndex==item.type }" |
|||
class="f-item" |
|||
@click="fClick(item)">{{ item.title }}</div> |
|||
</flexbox> |
|||
</div> |
|||
<div |
|||
:style="{ 'height': contentHeight }" |
|||
class="content"> |
|||
<div |
|||
v-if="showNoData" |
|||
class="no-data-container"> |
|||
<img |
|||
class="no-data" |
|||
src="@/assets/img/no_data.png" > |
|||
<div class="no-data-name">暂无数据</div> |
|||
</div> |
|||
<slot/> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script type="text/javascript"> |
|||
export default { |
|||
name: 'Sections', |
|||
components: {}, |
|||
props: { |
|||
title: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
mColor: { |
|||
type: String, |
|||
default: '#FF6767' |
|||
}, |
|||
/** 内容区域固定高度 */ |
|||
contentHeight: { |
|||
type: String, |
|||
default: '327px' |
|||
}, |
|||
/** 展示客户工作台 重要提醒 时间筛选 */ |
|||
showF: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
fItems: { |
|||
type: Array, |
|||
default: () => { |
|||
return [] |
|||
} |
|||
}, |
|||
/** 展示无数据 */ |
|||
showNoData: { |
|||
type: Boolean, |
|||
default: false |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
fIndex: -1 |
|||
} |
|||
}, |
|||
computed: {}, |
|||
mounted() {}, |
|||
methods: { |
|||
fClick(item) { |
|||
this.fIndex = item.type |
|||
this.$emit('f-click', 'val') |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style lang="scss" scoped> |
|||
.section { |
|||
position: relative; |
|||
background-color: white; |
|||
margin-top: 8px; |
|||
} |
|||
.section:first-child { |
|||
margin-top: 0; |
|||
} |
|||
|
|||
.section-mark { |
|||
border-left-width: 3px; |
|||
border-left-style: solid; |
|||
height: 10px; |
|||
} |
|||
|
|||
.section-header { |
|||
display: flex; |
|||
align-items: center; |
|||
padding: 5px 15px; |
|||
} |
|||
.section-title { |
|||
font-size: 13px; |
|||
color: #333; |
|||
margin-left: 8px; |
|||
flex-shrink: 0; |
|||
} |
|||
|
|||
.f-container { |
|||
width: auto; |
|||
margin-left: 40px; |
|||
.f-item { |
|||
padding: 2px 4px; |
|||
font-size: 12px; |
|||
margin-right: 10px; |
|||
color: #666; |
|||
} |
|||
.f-item-select { |
|||
border-radius: 2px; |
|||
background-color: #ff6767; |
|||
color: white; |
|||
} |
|||
} |
|||
|
|||
.content { |
|||
overflow: auto; |
|||
.no-data-container { |
|||
text-align: center; |
|||
.no-data { |
|||
margin-top: 30px; |
|||
} |
|||
.no-data-name { |
|||
font-size: 12px; |
|||
margin-top: 8px; |
|||
color: #666; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,177 @@ |
|||
<template> |
|||
<div class="wrapper"> |
|||
<ul class="list"> |
|||
<li |
|||
v-for="(item, index) in showObj.form" |
|||
:key="index" |
|||
class="list-item"> |
|||
<span v-if="item.formType == 'date'">{{ item.name +' “' + item.value[0] + '-' + item.value[1] + '”' }}</span> |
|||
<span v-else-if="item.formType === 'datetime'">{{ item.name +' “' + item.value[0] + '-' + item.value[1] + '”' }}</span> |
|||
<!-- <span v-else-if="item.formType === 'business_type'">{{ item.name +' “' + getTypesName(item) + getStatusName(item) + '”' }}</span> |
|||
<span v-else-if="item.formType === 'map_address'">{{ `${item.name} ${item.address.state} ${item.address.city} ${item.address.area}` }}</span> |
|||
<span v-else-if="item.formType === 'checkStatus'">{{ item.name +' “' + optionsNames[item.condition]+ '”'+' '+ getCheckName(item) }}</span> |
|||
<span v-else-if="item.formType === 'user'">{{ item.name +' ' + optionsNames[item.condition] + '“' + item.value[0].realname + '”' }}</span> |
|||
<span v-else-if="item.formType === 'category' && item.value.length > 0">{{ item.name +' “' + item.valueContent + '”' }}</span> --> |
|||
<span v-else-if="item.formType === 'select' && item.value.length > 0">{{ item.name + ' ' + optionsNames[item.condition] + '“' + getSelectName(item) + '”' }}</span> |
|||
<span v-else-if="item.formType === 'switch'">{{ item.name + ' ' + optionsNames[item.condition] + '“' + getSwitchName(item) + '”' }}</span> |
|||
<span v-else-if="item.formType != 'text' && item.fieldName.endsWith('ID')">{{ item.name + ' ' + optionsNames[item.condition] + '“' + getRelativeName(item) + '”' }}</span> |
|||
<span v-else>{{ item.name + ' ' + optionsNames[item.condition] + '“' + item.value + '”' }}</span> |
|||
<i |
|||
class="el-icon-close icon" |
|||
@click="handleDelete(item, index)"/> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'FilterContent', |
|||
props: { |
|||
obj: { |
|||
type: Object, |
|||
required: true, |
|||
default: () => { |
|||
return {} |
|||
} |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
// 获取条件名称 |
|||
optionsNames: { |
|||
is: '等于', |
|||
isNot: '不等于', |
|||
contains: '包含', |
|||
notContains: '不包含', |
|||
startWith: '开始于', |
|||
endWith: '结束于', |
|||
isNull: '为空', |
|||
isNotNull: '不为空', |
|||
eq: '等于', |
|||
neq: '不等于', |
|||
gt: '大于', |
|||
egt: '大于等于', |
|||
lt: '小于', |
|||
elt: '小于等于' |
|||
}, |
|||
// 展示信息 |
|||
showObj: {} |
|||
} |
|||
}, |
|||
computed: {}, |
|||
watch: { |
|||
obj: function(val) { |
|||
this.showObj = val |
|||
} |
|||
}, |
|||
mounted() { |
|||
this.showObj = this.obj |
|||
}, |
|||
methods: { |
|||
/** |
|||
* 删除高级筛选条件 |
|||
* @param index |
|||
*/ |
|||
handleDelete(item, index) { |
|||
this.$delete(this.showObj.obj, item.fieldName) |
|||
this.showObj.form.splice(index, 1) |
|||
this.$emit('delete', { item: item, index: index, obj: this.showObj }) |
|||
}, |
|||
// 商机组展示名称 |
|||
getTypesName(data) { |
|||
if (data.typeId) { |
|||
const obj = data.typeOption.find(item => { |
|||
return item.typeId === data.typeId |
|||
}) |
|||
return obj.name || '' |
|||
} |
|||
return '' |
|||
}, |
|||
getCheckName(data) { |
|||
let value = '' |
|||
data.setting.forEach(item => { |
|||
if (item.value === data.value) { |
|||
value = item.name |
|||
return |
|||
} |
|||
}) |
|||
return value |
|||
}, |
|||
// 商机阶段展示名称 |
|||
getStatusName(data) { |
|||
if (data.statusId) { |
|||
const obj = data.statusOption.find(item => { |
|||
return item.statusId === data.statusId |
|||
}) |
|||
if (obj.name) { |
|||
return '-' + obj.name |
|||
} |
|||
return '' |
|||
} |
|||
return '' |
|||
}, |
|||
getSelectName(data) { |
|||
let value = '' |
|||
data.setting.forEach(item => { |
|||
if (item.split(",")[1] === data.value) { |
|||
value = item.split(",")[0] |
|||
return |
|||
} |
|||
}) |
|||
return value |
|||
}, |
|||
getSwitchName(data) { |
|||
return data.value===false? '否':'是'; |
|||
} , |
|||
getRelativeName(data) |
|||
{ |
|||
return data.displadValue; |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang="scss"> |
|||
@mixin left() { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
@mixin center() { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
} |
|||
|
|||
.wrapper { |
|||
width: 100%; |
|||
min-height: 50px; |
|||
background: white; |
|||
border-top: 1px solid #e1e1e1; |
|||
font-size: 13px; |
|||
overflow-x: scroll; |
|||
color: #aaa; |
|||
@include left; |
|||
.list { |
|||
width: 100%; |
|||
padding: 0 20px; |
|||
margin-bottom: 10px; |
|||
flex-shrink: 0; |
|||
@include left; |
|||
.list-item { |
|||
height: 30px; |
|||
padding: 0 10px; |
|||
margin: 10px 15px 0 0; |
|||
border: 1px solid #e1e1e1; |
|||
border-radius: 3px; |
|||
flex-shrink: 0; |
|||
@include center; |
|||
.icon { |
|||
margin-left: 20px; |
|||
cursor: pointer; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
File diff suppressed because one or more lines are too long
@ -0,0 +1,156 @@ |
|||
<template> |
|||
<div v-loading="loading"> |
|||
<div v-empty="list.length === 0"> |
|||
<div class="log-items"> |
|||
<follow-record-cell |
|||
v-for="(item, index) in list" |
|||
:item="item" |
|||
:index="index" |
|||
:crm-type="crmType" |
|||
:key="index" |
|||
@on-handle="cellHandle"/> |
|||
<div class="load"> |
|||
<el-button |
|||
:loading="loadMoreLoading" |
|||
type="text">{{ loadMoreLoading ? '加载更多' : '没有更多了' }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import FollowRecordCell from './components/FollowRecordCell' // 跟进记录 |
|||
import { crmLeadsRecordIndex } from '@/api/ux/clue' |
|||
// import { crmCustomerRecordIndex } from '@/api/customermanagement/customer' |
|||
// import { crmContactsRecordIndex } from '@/api/customermanagement/contacts' |
|||
// import { crmBusinessRecordIndex } from '@/api/customermanagement/business' |
|||
// import { crmContractRecordIndex } from '@/api/customermanagement/contract' |
|||
|
|||
export default { |
|||
/** 线索管理 的 线索详情 的 跟进记录*/ |
|||
name: 'RecordLog', |
|||
components: { |
|||
FollowRecordCell |
|||
}, |
|||
props: { |
|||
/** 模块ID */ |
|||
id: [String, Number], |
|||
/** 没有值就是全部类型 有值就是当个类型 */ |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
loading: false, |
|||
loadMoreLoading: true, |
|||
isPost: false, |
|||
page: 1, |
|||
list: [] // 跟进记录列表 |
|||
} |
|||
}, |
|||
computed: {}, |
|||
watch: { |
|||
id: function(val) { |
|||
this.refreshList() |
|||
} |
|||
}, |
|||
mounted() { |
|||
this.$bus.on('follow-log-refresh', data => { |
|||
if (data.type == 'record-log') { |
|||
this.refreshList() |
|||
} |
|||
}) |
|||
|
|||
// 分批次加载 |
|||
const dom = document.getElementById('follow-log-content') |
|||
dom.onscroll = () => { |
|||
const scrollOff = dom.scrollTop + dom.clientHeight - dom.scrollHeight |
|||
// 滚动条到底部的条件 |
|||
if (Math.abs(scrollOff) < 10 && this.loadMoreLoading == true) { |
|||
if (!this.isPost) { |
|||
this.isPost = true |
|||
this.page++ |
|||
this.getList() |
|||
} else { |
|||
this.loadMoreLoading = false |
|||
} |
|||
} |
|||
} |
|||
|
|||
this.getList() |
|||
}, |
|||
activated: function() {}, |
|||
deactivated: function() {}, |
|||
|
|||
beforeDestroy() { |
|||
this.$bus.off('follow-log-refresh') |
|||
}, |
|||
methods: { |
|||
getList() { |
|||
this.loading = true |
|||
const request = { |
|||
// customer: crmCustomerRecordIndex, |
|||
leads: crmLeadsRecordIndex, |
|||
// contacts: crmContactsRecordIndex, |
|||
// business: crmBusinessRecordIndex, |
|||
// contract: crmContractRecordIndex |
|||
}[this.crmType] |
|||
const params = { |
|||
page: this.page, |
|||
limit: 10 |
|||
} |
|||
params[this.crmType + 'Id'] = this.id |
|||
request(params) |
|||
.then(res => { |
|||
this.list = this.list.concat(res.data) |
|||
if (res.data.length < 10) { |
|||
this.loadMoreLoading = false |
|||
} else { |
|||
this.loadMoreLoading = true |
|||
} |
|||
this.loading = false |
|||
this.isPost = false |
|||
}) |
|||
.catch(() => { |
|||
this.isPost = false |
|||
this.loading = false |
|||
}) |
|||
}, |
|||
refreshList() { |
|||
this.page = 1 |
|||
this.list = [] |
|||
this.getList() |
|||
}, |
|||
/** |
|||
* 行布局删除 |
|||
*/ |
|||
cellHandle(data) { |
|||
if (data.type == 'delete') { |
|||
this.list.splice(data.data.index, 1) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.log-items { |
|||
min-height: 400px; |
|||
position: relative; |
|||
} |
|||
|
|||
.load { |
|||
color: #999; |
|||
font-size: 13px; |
|||
margin: 0 auto 15px; |
|||
text-align: center; |
|||
.el-button, |
|||
.el-button:focus { |
|||
color: #ccc; |
|||
cursor: auto; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,223 @@ |
|||
<template> |
|||
<div class="fl-c"> |
|||
<flexbox class="fl-h"> |
|||
<div |
|||
v-photo="{img: item.userImg, realname: item.realname}" |
|||
v-lazy:background-image="$options.filters.filterUserLazyImg(item.userImg)" |
|||
class="div-photo fl-h-img"/> |
|||
<div class="fl-h-b"> |
|||
<div class="fl-h-name">{{ item.realname }}</div> |
|||
<div class="fl-h-time">{{ item.createTime }}</div> |
|||
</div> |
|||
<flexbox class="fl-h-mark"> |
|||
<img |
|||
class="fl-h-mark-img" |
|||
src="@/assets/img/follow_record.png" > |
|||
<div class="fl-h-mark-name">跟进记录</div> |
|||
</flexbox> |
|||
<el-dropdown |
|||
trigger="click" |
|||
@command="handleCommand"> |
|||
<i |
|||
style="color:#CDCDCD;margin-left: 8px;" |
|||
class="el-icon-arrow-down el-icon-more"/> |
|||
<el-dropdown-menu slot="dropdown"> |
|||
<el-dropdown-item command="delete">删除</el-dropdown-item> |
|||
</el-dropdown-menu> |
|||
</el-dropdown> |
|||
</flexbox> |
|||
<div class="fl-b"> |
|||
<div class="fl-b-content">{{ item.content }}</div> |
|||
<flexbox |
|||
v-if="item.img && item.img.length > 0" |
|||
class="fl-b-images" |
|||
wrap="wrap"> |
|||
<div |
|||
v-lazy:background-image="file.filePath" |
|||
v-for="(file, index) in item.img" |
|||
:key="file.filePath" |
|||
class="fl-b-img-item" |
|||
@click="previewImg(item.img, index)"/> |
|||
</flexbox> |
|||
<div |
|||
v-if="item.file && item.file.length > 0" |
|||
class="fl-b-files"> |
|||
<flexbox |
|||
v-for="(file, index) in item.file" |
|||
:key="index" |
|||
class="cell"> |
|||
<img |
|||
class="cell-head" |
|||
src="@/assets/img/relevance_file.png" > |
|||
<div class="cell-body">{{ file.name }}<span style="color: #ccc;">({{ file.size }})</span></div> |
|||
<el-button |
|||
type="primary" |
|||
icon="el-icon-download" |
|||
@click="downloadFile(file)">下载</el-button> |
|||
</flexbox> |
|||
</div> |
|||
<div |
|||
v-if="item.category || item.nextTime" |
|||
class="follow"> |
|||
<span |
|||
v-if="item.category" |
|||
class="follow-info">{{ item.category }}</span> |
|||
<span |
|||
v-if="item.nextTime" |
|||
class="follow-info">{{ item.nextTime }}</span> |
|||
</div> |
|||
<div |
|||
v-if="item.contactsList && item.contactsList.length > 0" |
|||
class="fl-b-other"> |
|||
<div class="fl-b-other-name">关联联系人</div> |
|||
<div> |
|||
<flexbox |
|||
v-for="(item, index) in item.contactsList" |
|||
:key="index" |
|||
class="cell" |
|||
@click.native="checkRelationDetail('contacts', item.contactsId)"> |
|||
<i |
|||
:style="{'opacity': index == 0 ? 1 : 0}" |
|||
class="wukong wukong-contacts cell-head crm-type"/> |
|||
<div |
|||
class="cell-body" |
|||
style="color: #6394E5;cursor: pointer;">{{ item.name }}</div> |
|||
</flexbox> |
|||
</div> |
|||
</div> |
|||
<div |
|||
v-if="item.businessList && item.businessList.length > 0" |
|||
class="fl-b-other"> |
|||
<div class="fl-b-other-name">关联商机</div> |
|||
<div> |
|||
<flexbox |
|||
v-for="(item, index) in item.businessList" |
|||
:key="index" |
|||
class="cell" |
|||
@click.native="checkRelationDetail('business', item.businessId)"> |
|||
<i |
|||
:style="{'opacity': index == 0 ? 1 : 0}" |
|||
class="wukong wukong-business cell-head crm-type"/> |
|||
<div |
|||
class="cell-body" |
|||
style="color: #6394E5;cursor: pointer;">{{ item.businessName }}</div> |
|||
</flexbox> |
|||
</div> |
|||
</div> |
|||
<slot/> |
|||
</div> |
|||
<!-- <c-r-m-full-screen-detail--> |
|||
<!-- :visible.sync="showFullDetail"--> |
|||
<!-- :crm-type="relationCrmType"--> |
|||
<!-- :id="relationID"/>--> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
// import { downloadFile } from '@/utils' |
|||
// import { crmRecordDelete } from '@/api/customermanagement/common' |
|||
|
|||
export default { |
|||
/** 客户管理 的 客户详情 的 跟进记录cell*/ |
|||
name: 'FollowRecordCell', |
|||
components: { |
|||
// CRMFullScreenDetail: () => |
|||
// import('@/views/customermanagement/components/CRMFullScreenDetail.vue') |
|||
}, |
|||
props: { |
|||
item: { |
|||
type: Object, |
|||
default: () => { |
|||
return {} |
|||
} |
|||
}, |
|||
/** 没有值就是全部类型 有值就是当个类型 */ |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
index: [String, Number] |
|||
}, |
|||
data() { |
|||
return { |
|||
showFullDetail: false, // 查看相关客户管理详情 |
|||
relationID: '', // 相关ID参数 |
|||
relationCrmType: '' // 相关类型 |
|||
} |
|||
}, |
|||
computed: {}, |
|||
mounted() {}, |
|||
methods: { |
|||
previewImg(list, index) { |
|||
this.$bus.emit('preview-image-bus', { |
|||
index: index, |
|||
data: list.map(function(item, index, array) { |
|||
item.url = item.filePath |
|||
return item |
|||
}) |
|||
}) |
|||
}, |
|||
downloadFile(file) { |
|||
// downloadFile({ path: file.filePath, name: file.name }) |
|||
}, |
|||
/** |
|||
* 删除跟进记录 |
|||
*/ |
|||
handleCommand(command) { |
|||
// this.$confirm('确定删除?', '提示', { |
|||
// confirmButtonText: '确定', |
|||
// cancelButtonText: '取消', |
|||
// type: 'warning' |
|||
// }) |
|||
// .then(() => { |
|||
// crmRecordDelete({ |
|||
// recordId: this.item.recordId |
|||
// }) |
|||
// .then(res => { |
|||
// this.$emit('on-handle', { |
|||
// type: command, |
|||
// data: { item: this.item, index: this.index } |
|||
// }) |
|||
// this.$message.success('操作成功') |
|||
// }) |
|||
// .catch(() => {}) |
|||
// }) |
|||
// .catch(() => { |
|||
// this.$message({ |
|||
// type: 'info', |
|||
// message: '已取消操作' |
|||
// }) |
|||
// }) |
|||
}, |
|||
/** |
|||
* 查看相关客户管理详情 |
|||
*/ |
|||
checkRelationDetail(type, id) { |
|||
this.relationID = id |
|||
this.relationCrmType = type |
|||
this.showFullDetail = true |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
@import '../styles/followcell.scss'; |
|||
.follow { |
|||
.follow-info { |
|||
padding: 5px 10px; |
|||
background-color: #f5f7fa; |
|||
color: #999; |
|||
height: 40px; |
|||
line-height: 40px; |
|||
border-radius: 28px; |
|||
font-size: 12px; |
|||
margin-right: 10px; |
|||
} |
|||
} |
|||
|
|||
.crm-type { |
|||
color: rgb(99, 148, 229); |
|||
font-size: 14px; |
|||
} |
|||
</style> |
@ -0,0 +1,174 @@ |
|||
/** 跟进记录相关的 日志 审批任务 日程 项目 公共css */ |
|||
.fl-c { |
|||
background-color: white; |
|||
padding: 10px 20px; |
|||
position: relative; |
|||
} |
|||
|
|||
/** 头部布局 名字 头像 */ |
|||
.fl-h { |
|||
.fl-h-img { |
|||
display: block; |
|||
width: 34px; |
|||
height: 34px; |
|||
border-radius: 17px; |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.fl-h-b { |
|||
flex: 1; |
|||
|
|||
.fl-h-name { |
|||
font-size: 13px; |
|||
color: #333; |
|||
} |
|||
|
|||
.fl-h-time { |
|||
font-size: 12px; |
|||
color: #999; |
|||
margin-top: 3px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** 头部 右侧 布局*/ |
|||
.fl-h-handle { |
|||
width: auto; |
|||
|
|||
.fl-h-handle-name { |
|||
font-size: 13px; |
|||
color: #333; |
|||
margin-right: 6px; |
|||
} |
|||
} |
|||
|
|||
.fl-h-mark { |
|||
width: auto; |
|||
|
|||
.fl-h-mark-img { |
|||
display: block; |
|||
width: 20px; |
|||
height: 20px; |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.fl-h-mark-name { |
|||
font-size: 13px; |
|||
color: #333; |
|||
} |
|||
} |
|||
|
|||
/** 内容区域 */ |
|||
.fl-b { |
|||
margin: 20px 0 0 40px; |
|||
|
|||
.fl-b-content { |
|||
font-size: 13px; |
|||
color: #333; |
|||
margin-bottom: 10px; |
|||
white-space: pre-wrap; |
|||
word-wrap: break-word; |
|||
letter-spacing: 0.5px; |
|||
line-height: 18px; |
|||
} |
|||
|
|||
.fl-b-images { |
|||
margin-top: 5px; |
|||
width: 310px; |
|||
|
|||
.fl-b-img-item { |
|||
width: 98px; |
|||
height: 98px; |
|||
display: inline-block; |
|||
margin: 0 4px 4px 0; |
|||
background-size: contain; |
|||
background-repeat: no-repeat; |
|||
background-position: center; |
|||
position: relative; |
|||
cursor: pointer; |
|||
} |
|||
} |
|||
|
|||
.fl-b-other { |
|||
margin: 8px 0; |
|||
|
|||
.fl-b-other-name { |
|||
margin: 10px 0; |
|||
color: #666; |
|||
font-size: 13px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.fl-c:before { |
|||
content: " "; |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; |
|||
height: 1px; |
|||
border-top: 1px solid #e5e5e5; |
|||
color: #e5e5e5; |
|||
-webkit-transform-origin: 0 0; |
|||
transform-origin: 0 0; |
|||
-webkit-transform: scaleY(0.5); |
|||
transform: scaleY(0.5); |
|||
left: 15px; |
|||
z-index: 2; |
|||
} |
|||
|
|||
.fl-c:first-child:before { |
|||
display: none; |
|||
} |
|||
|
|||
/** 附件 */ |
|||
.fl-b-files { |
|||
margin-top: 10px; |
|||
} |
|||
|
|||
/** 关联附件 联系人 客户 行布局 */ |
|||
.cell { |
|||
padding: 8px; |
|||
background-color: #F5F7FA; |
|||
border-radius: 2px; |
|||
position: relative; |
|||
|
|||
.cell-head { |
|||
display: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.cell-body { |
|||
flex: 1; |
|||
color: #333; |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.cell-foot { |
|||
display: block; |
|||
width: 20px; |
|||
padding: 0 4px; |
|||
margin-right: 8px; |
|||
} |
|||
} |
|||
|
|||
.cell:before { |
|||
content: " "; |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; |
|||
height: 1px; |
|||
border-top: 1px solid #e5e5e5; |
|||
color: #e5e5e5; |
|||
-webkit-transform-origin: 0 0; |
|||
transform-origin: 0 0; |
|||
-webkit-transform: scaleY(0.5); |
|||
transform: scaleY(0.5); |
|||
left: 30px; |
|||
z-index: 2; |
|||
} |
|||
|
|||
.cell:first-child:before { |
|||
display: none; |
|||
} |
@ -0,0 +1,640 @@ |
|||
<template> |
|||
<el-dialog |
|||
:title="edit_id ? '编辑场景' : '新建场景'" |
|||
:visible.sync="visible" |
|||
:append-to-body="true" |
|||
width="800px" |
|||
@close="handleCancel"> |
|||
<div class="scene-name-container"> |
|||
<div class="scene-name">场景名称</div> |
|||
<el-input |
|||
v-model.trim="saveName" |
|||
:maxlength="10" |
|||
class="scene-input" |
|||
placeholder="请输入场景名称,最多10个字符"/> |
|||
</div> |
|||
<div class="scene-name">筛选条件</div> |
|||
<el-form |
|||
id="scene-filter-container" |
|||
class="filter-container"> |
|||
<el-form-item> |
|||
<template v-for="(formItem, index) in form"> |
|||
<el-row :key="index"> |
|||
<el-col :span="8"> |
|||
<el-select |
|||
v-model="formItem.fieldName" |
|||
placeholder="请选择要筛选的字段名" |
|||
@change="fieldChange(formItem)"> |
|||
<el-option |
|||
v-for="item in fieldList" |
|||
:key="item.fieldName" |
|||
:label="item.name" |
|||
:value="item.fieldName"/> |
|||
</el-select> |
|||
</el-col> |
|||
|
|||
<el-col |
|||
v-if="formItem.formType !== 'date' && formItem.formType !== 'datetime' && formItem.formType !== 'business_type'" |
|||
:span="1"> </el-col> |
|||
<el-col |
|||
v-if="formItem.formType !== 'date' && formItem.formType !== 'datetime' && formItem.formType !== 'business_type'" |
|||
:span="4"> |
|||
<el-select |
|||
v-model="formItem.condition" |
|||
placeholder="请选择范围"> |
|||
<el-option |
|||
v-for="item in calConditionOptions(formItem.formType, formItem)" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value"/> |
|||
</el-select> |
|||
</el-col> |
|||
|
|||
<!-- 商机组 --> |
|||
<el-col |
|||
v-if="formItem.formType == 'business_type'" |
|||
:span="1"> </el-col> |
|||
<el-col |
|||
v-if="formItem.formType == 'business_type'" |
|||
:span="4"> |
|||
<el-select |
|||
v-model="formItem.typeId" |
|||
placeholder="请选择" |
|||
@change="typeOptionsChange(formItem)"> |
|||
<el-option |
|||
v-for="item in formItem.typeOption" |
|||
:key="item.typeId" |
|||
:label="item.name" |
|||
:value="item.typeId"/> |
|||
</el-select> |
|||
</el-col> |
|||
|
|||
<el-col :span="1"> </el-col> |
|||
<el-col :span="formItem.formType === 'datetime' || formItem.formType === 'date' ? 13 : 8"> |
|||
<el-select |
|||
v-if="formItem.formType === 'select'" |
|||
v-model="formItem.value" |
|||
placeholder="请选择筛选条件"> |
|||
<el-option |
|||
v-for="item in formItem.setting" |
|||
:key="item" |
|||
:label="item" |
|||
:value="item"/> |
|||
</el-select> |
|||
<el-select |
|||
v-else-if="formItem.formType === 'checkStatus'" |
|||
v-model="formItem.value" |
|||
placeholder="请选择筛选条件"> |
|||
<el-option |
|||
v-for="item in formItem.setting" |
|||
:key="item.value" |
|||
:label="item.name" |
|||
:value="item.value"/> |
|||
</el-select> |
|||
<el-date-picker |
|||
v-else-if="formItem.formType === 'date' || formItem.formType === 'datetime'" |
|||
v-model="formItem.value" |
|||
:value-format="formItem.formType === 'date' ? 'yyyy-MM-dd' : 'yyyy-MM-dd HH:mm:ss'" |
|||
:type="formItem.formType === 'date' ? 'daterange' : 'datetimerange'" |
|||
style="padding: 0px 10px;" |
|||
range-separator="-" |
|||
start-placeholder="开始日期" |
|||
end-placeholder="结束日期"/> |
|||
<el-select |
|||
v-else-if="formItem.formType === 'business_type'" |
|||
v-model="formItem.statusId" |
|||
placeholder="请选择"> |
|||
<el-option |
|||
v-for="item in formItem.statusOption" |
|||
:key="item.statusId" |
|||
:label="item.name" |
|||
:value="item.statusId"/> |
|||
</el-select> |
|||
<!-- <xh-user-cell--> |
|||
<!-- v-else-if="formItem.formType === 'user'"--> |
|||
<!-- :item="formItem"--> |
|||
<!-- :value="formItem.value"--> |
|||
<!-- @value-change="userValueChange"/>--> |
|||
<el-input |
|||
v-else |
|||
v-model="formItem.value" |
|||
placeholder="请输入筛选条件"/> |
|||
</el-col> |
|||
<el-col |
|||
:span="1" |
|||
class="delete"> |
|||
<i |
|||
class="el-icon-error delete-btn" |
|||
@click="handleDelete(index)"/> |
|||
</el-col> |
|||
</el-row> |
|||
</template> |
|||
</el-form-item> |
|||
</el-form> |
|||
<p |
|||
v-show="showErrors" |
|||
class="el-icon-warning warning-info"> |
|||
<span class="desc">筛选条件中有重复项!</span> |
|||
</p> |
|||
<el-button |
|||
type="text" |
|||
@click="handleAdd">+ 添加筛选条件</el-button> |
|||
<div class="save"> |
|||
<div class="save-setting"> |
|||
<el-checkbox v-model="saveDefault">设置为默认</el-checkbox> |
|||
</div> |
|||
</div> |
|||
<div |
|||
slot="footer" |
|||
class="dialog-footer"> |
|||
<el-button @click="handleCancel">取 消</el-button> |
|||
<el-button |
|||
type="primary" |
|||
@click="handleConfirm">确 定</el-button> |
|||
</div> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
// import crmTypeModel from '@/views/ux/model/crmTypeModel' |
|||
// import { crmSceneSave, crmSceneUpdate } from '@/api/customermanagement/common' |
|||
import { |
|||
objDeepCopy |
|||
} from '@/utils' |
|||
// import { XhUserCell } from '@/components/CreateCom' |
|||
|
|||
/** |
|||
* fieldList: 高级筛选的字段 |
|||
* type: date || datetime || select || 其他 input |
|||
*/ |
|||
export default { |
|||
name: 'SceneCreate', // 新建场景 |
|||
components: { |
|||
// XhUserCell |
|||
}, |
|||
props: { |
|||
dialogVisible: { |
|||
type: Boolean, |
|||
required: true, |
|||
default: false |
|||
}, |
|||
fieldList: { |
|||
type: Array, |
|||
required: true, |
|||
default: () => { |
|||
return [] |
|||
} |
|||
}, |
|||
obj: { |
|||
type: Object, |
|||
default: () => { |
|||
return {} |
|||
}, |
|||
required: true |
|||
}, |
|||
/** 没有值就是全部类型 有值就是当个类型 */ |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
/** 名字和 默认 id 编辑的时候需要 */ |
|||
name: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
isDefault: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
edit_id: { |
|||
type: String, |
|||
default: '' |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
form: [], |
|||
visible: false, // 控制展示 |
|||
showErrors: false, |
|||
saveDefault: false, // 设置为默认场景 |
|||
saveName: null // 场景名称 |
|||
} |
|||
}, |
|||
watch: { |
|||
dialogVisible: { |
|||
handler(val) { |
|||
if (val) { |
|||
// 处理编辑数据 |
|||
if (this.edit_id) { |
|||
this.form = [] |
|||
for (const field in this.obj.obj) { |
|||
const element = this.obj.obj[field] |
|||
const item = this.getItem() |
|||
item.fieldName = element.name |
|||
item.condition = element.condition |
|||
item.formType = element.formType |
|||
if (element.formType == 'date') { |
|||
item.value = [element.start_date, element.end_date] |
|||
} else if (element.formType == 'datetime') { |
|||
item.value = [element.start, element.end] |
|||
} else if (element.formType == 'business_type') { |
|||
item.typeId = element.typeId |
|||
item.statusId = element.statusId |
|||
item.typeOption = element.setting |
|||
if (element.typeId) { |
|||
const obj = element.setting.find(typeItem => { |
|||
return typeItem.typeId === element.typeId |
|||
}) |
|||
if (obj) { |
|||
item.statusOption = obj.statusList |
|||
} else { |
|||
item.statusOption = [] |
|||
} |
|||
} |
|||
} else if (element.formType == 'user') { |
|||
item.value = element.setting ? [element.setting] : [] |
|||
} else { |
|||
item.setting = element.setting |
|||
item.value = element.value |
|||
} |
|||
this.form.push(item) |
|||
} |
|||
} else { |
|||
this.form = objDeepCopy(this.obj.form) |
|||
if (this.form.length == 0) { |
|||
this.form.push(this.getItem()) |
|||
} |
|||
} |
|||
|
|||
/** 只有编辑会牵扯到这两个字段赋值 */ |
|||
if (this.name) { |
|||
this.saveName = this.name |
|||
} else { |
|||
this.saveName = '' |
|||
} |
|||
if (this.isDefault) { |
|||
this.saveDefault = this.isDefault |
|||
} else { |
|||
this.saveDefault = false |
|||
} |
|||
} |
|||
this.visible = this.dialogVisible |
|||
}, |
|||
deep: true, |
|||
immediate: true |
|||
}, |
|||
|
|||
form() { |
|||
this.$nextTick(() => { |
|||
var container = document.getElementById('scene-filter-container') |
|||
container.scrollTop = container.scrollHeight |
|||
}) |
|||
} |
|||
}, |
|||
methods: { |
|||
getItem() { |
|||
return { |
|||
fieldName: '', |
|||
name: '', |
|||
formType: '', |
|||
condition: 'is', |
|||
value: '', |
|||
typeOption: [], |
|||
statusOption: [], |
|||
typeId: '', |
|||
statusId: '' |
|||
} |
|||
}, |
|||
/** |
|||
* 商机组状态 |
|||
*/ |
|||
typeOptionsChange(formItem) { |
|||
if (formItem.typeId) { |
|||
const obj = formItem.typeOption.find(item => { |
|||
return item.typeId === formItem.typeId |
|||
}) |
|||
formItem.statusOption = obj.statusList || [] |
|||
} else { |
|||
formItem.statusOption = [] |
|||
} |
|||
formItem.statusId = '' |
|||
}, |
|||
/** |
|||
* 用户创建人 |
|||
*/ |
|||
userValueChange(data) { |
|||
if (data.value.length > 0) { |
|||
data.item.value = data.value |
|||
} else { |
|||
data.item.value = [] |
|||
} |
|||
}, |
|||
/** 条件数据源 */ |
|||
calConditionOptions(formType, item) { |
|||
if ( |
|||
formType == 'select' || |
|||
formType == 'checkbox' || |
|||
formType == 'user' || |
|||
formType == 'checkStatus' |
|||
) { |
|||
return [ |
|||
{ value: 'is', label: '等于', disabled: false }, |
|||
{ value: 'isNot', label: '不等于', disabled: false } |
|||
] |
|||
} else if ( |
|||
formType == 'module' || |
|||
formType == 'text' || |
|||
formType == 'textarea' |
|||
) { |
|||
return [ |
|||
{ value: 'is', label: '等于', disabled: false }, |
|||
{ value: 'isNot', label: '不等于', disabled: false }, |
|||
{ value: 'contains', label: '包含', disabled: false }, |
|||
{ value: 'notContains', label: '不包含', disabled: false } |
|||
] |
|||
} else if (formType == 'floatnumber' || formType == 'number') { |
|||
return [ |
|||
{ value: 'is', label: '等于', disabled: false }, |
|||
{ value: 'isNot', label: '不等于', disabled: false }, |
|||
{ value: 'contains', label: '包含', disabled: false }, |
|||
{ value: 'notContains', label: '不包含', disabled: false }, |
|||
{ value: 'isNull', label: '为空', disabled: false }, |
|||
{ value: 'isNotNull', label: '不为空', disabled: false }, |
|||
{ value: 'gt', label: '大于', disabled: false }, |
|||
{ value: 'egt', label: '大于等于', disabled: false }, |
|||
{ value: 'lt', label: '小于', disabled: false }, |
|||
{ value: 'elt', label: '小于等于', disabled: false } |
|||
] |
|||
} else { |
|||
return [ |
|||
{ value: 'is', label: '等于', disabled: false }, |
|||
{ value: 'isNot', label: '不等于', disabled: false }, |
|||
{ value: 'contains', label: '包含', disabled: false }, |
|||
{ value: 'notContains', label: '不包含', disabled: false }, |
|||
{ value: 'startWith', label: '开始于', disabled: false }, |
|||
{ value: 'endWith', label: '结束于', disabled: false }, |
|||
{ value: 'isNull', label: '为空', disabled: false }, |
|||
{ value: 'isNotNull', label: '不为空', disabled: false }, |
|||
{ value: 'gt', label: '大于', disabled: false }, |
|||
{ value: 'egt', label: '大于等于', disabled: false }, |
|||
{ value: 'lt', label: '小于', disabled: false }, |
|||
{ value: 'elt', label: '小于等于', disabled: false } |
|||
] |
|||
} |
|||
}, |
|||
/** |
|||
* 当前选择的字段名改变,判断是否有重复 |
|||
* @param formItem |
|||
*/ |
|||
fieldChange(formItem) { |
|||
const obj = this.fieldList.find(item => { |
|||
return item.fieldName === formItem.fieldName |
|||
}) |
|||
if (obj) { |
|||
formItem.formType = obj.formType |
|||
formItem.name = obj.name |
|||
if (formItem.formType == 'business_type') { |
|||
formItem.typeOption = obj.setting |
|||
formItem.statusOption = [] |
|||
formItem.typeId = '' |
|||
formItem.statusId = '' |
|||
} else if ( |
|||
formItem.formType == 'select' || |
|||
formItem.formType == 'checkStatus' |
|||
) { |
|||
formItem.setting = obj.setting || [] |
|||
} else if ( |
|||
formItem.formType === 'date' || |
|||
formItem.formType === 'datetime' || |
|||
formItem.formType === 'user' |
|||
) { |
|||
formItem.value = [] |
|||
} |
|||
} |
|||
|
|||
const arr = this.form.filter(item => { |
|||
return item.fieldName === formItem.fieldName |
|||
}) |
|||
if (arr.length > 1) this.showErrors = true |
|||
else this.showErrors = false |
|||
}, |
|||
/** |
|||
* 取消选择 |
|||
*/ |
|||
handleCancel() { |
|||
this.visible = false |
|||
this.$emit('update:dialogVisible', false) |
|||
}, |
|||
/** |
|||
* 确定选择 |
|||
*/ |
|||
handleConfirm() { |
|||
if (this.showErrors) { |
|||
this.$message.error('筛选条件中有重复项!') |
|||
return |
|||
} |
|||
if (!this.saveName || this.saveName === '') { |
|||
this.$message.error('场景名称不能为空!') |
|||
return |
|||
} |
|||
for (let i = 0; i < this.form.length; i++) { |
|||
const o = this.form[i] |
|||
if (!o.fieldName || o.fieldName === '') { |
|||
this.$message.error('要筛选的字段名称不能为空!') |
|||
return |
|||
} |
|||
|
|||
if (o.formType == 'business_type') { |
|||
if (!o.typeId && !o.statusId) { |
|||
this.$message.error('请输入筛选条件的值!') |
|||
return |
|||
} |
|||
} else if ( |
|||
o.formType == 'date' || |
|||
o.formType == 'datetime' || |
|||
o.formType == 'user' |
|||
) { |
|||
if (!o.value || o.value.length === 0) { |
|||
this.$message.error('请输入筛选条件的值!') |
|||
return |
|||
} |
|||
} else if (!o.value) { |
|||
this.$message.error('请输入筛选条件的值!') |
|||
return |
|||
} |
|||
} |
|||
const obj = {} |
|||
this.form.forEach(o => { |
|||
if (o.formType == 'datetime' || o.formType == 'date') { |
|||
obj[o.fieldName] = { |
|||
start: o.value[0], |
|||
end: o.value[1], |
|||
formType: o.formType, |
|||
name: o.fieldName |
|||
} |
|||
} else if (o.formType == 'business_type') { |
|||
obj[o.fieldName] = { |
|||
typeId: o.typeId, |
|||
statusId: o.statusId, |
|||
formType: o.formType, |
|||
name: o.fieldName |
|||
} |
|||
} else if (o.formType == 'user') { |
|||
obj[o.fieldName] = { |
|||
condition: o.condition, |
|||
value: o.value[0].userId, |
|||
formType: o.formType, |
|||
setting: o.value[0], |
|||
name: o.fieldName |
|||
} |
|||
} else { |
|||
obj[o.fieldName] = { |
|||
condition: o.condition, |
|||
value: o.value, |
|||
formType: o.formType, |
|||
name: o.fieldName |
|||
} |
|||
} |
|||
}) |
|||
const data = { |
|||
obj: obj, |
|||
form: this.form, |
|||
saveDefault: this.saveDefault, |
|||
saveName: this.saveName |
|||
} |
|||
this.requestCreateScene(data) |
|||
}, |
|||
// 创建场景 |
|||
requestCreateScene(data) { |
|||
/** 编辑操作 */ |
|||
if (this.edit_id) { |
|||
// crmSceneUpdate({ |
|||
// isDefault: data.saveDefault ? 1 : 0, |
|||
// name: data.saveName, |
|||
// sceneId: this.edit_id, |
|||
// data: JSON.stringify(data.obj) |
|||
// }) |
|||
// .then(res => { |
|||
// this.$message({ |
|||
// type: 'success', |
|||
// message: '编辑成功' |
|||
// }) |
|||
// // 新建成功 |
|||
// this.$emit('saveSuccess') |
|||
// this.handleCancel() |
|||
// }) |
|||
// .catch(() => {}) |
|||
} else { |
|||
// crmSceneSave({ |
|||
// type: crmTypeModel[this.crmType], |
|||
// isDefault: data.saveDefault ? 1 : 0, |
|||
// name: data.saveName, |
|||
// data: JSON.stringify(data.obj) |
|||
// }) |
|||
// .then(res => { |
|||
// this.$message({ |
|||
// type: 'success', |
|||
// message: '创建成功' |
|||
// }) |
|||
// // 新建成功 |
|||
// this.$emit('saveSuccess') |
|||
// this.handleCancel() |
|||
// }) |
|||
// .catch(() => {}) |
|||
} |
|||
}, |
|||
/** |
|||
* 添加筛选条件 |
|||
*/ |
|||
handleAdd() { |
|||
this.form.push(this.getItem()) |
|||
}, |
|||
/** |
|||
* 删除筛选条件 |
|||
* @param index |
|||
*/ |
|||
handleDelete(index) { |
|||
this.$confirm('您确定要删除这一条数据吗?', '提示', { |
|||
confirmButtonText: '确定', |
|||
cancelButtonText: '取消', |
|||
type: 'warning' |
|||
}) |
|||
.then(() => { |
|||
this.form.splice(index, 1) |
|||
}) |
|||
.catch(() => { |
|||
this.$message({ |
|||
type: 'info', |
|||
message: '已取消删除' |
|||
}) |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
/deep/ .el-dialog__body { |
|||
padding: 10px 20px; |
|||
} |
|||
|
|||
/deep/ .el-form-item__label { |
|||
width: 100%; |
|||
text-align: left; |
|||
} |
|||
.filter-container { |
|||
max-height: 200px; |
|||
overflow-y: auto; |
|||
} |
|||
|
|||
.save { |
|||
margin-top: 10px; |
|||
.name { |
|||
width: 300px; |
|||
margin-left: 10px; |
|||
/deep/ .el-input__inner { |
|||
height: 32px; |
|||
} |
|||
} |
|||
.save-setting { |
|||
margin-top: 20px; |
|||
} |
|||
} |
|||
|
|||
.el-form-item { |
|||
margin-bottom: 0; |
|||
} |
|||
|
|||
.el-row { |
|||
margin-bottom: 20px; |
|||
.delete-btn { |
|||
margin-left: 15px; |
|||
color: #bbb; |
|||
cursor: pointer; |
|||
} |
|||
.el-select, |
|||
.el-date-editor { |
|||
width: 100%; |
|||
} |
|||
} |
|||
|
|||
.warning-info { |
|||
width: 100%; |
|||
font-size: 14px; |
|||
color: #f56c6c; |
|||
margin-top: 10px; |
|||
.desc { |
|||
padding-left: 8px; |
|||
} |
|||
} |
|||
|
|||
.scene-name-container { |
|||
padding-bottom: 15px; |
|||
.scene-input { |
|||
width: 300px; |
|||
} |
|||
} |
|||
.scene-name { |
|||
margin-bottom: 10px; |
|||
} |
|||
</style> |
@ -0,0 +1,156 @@ |
|||
<template> |
|||
<div class="scene-container"> |
|||
<div class="scene-list"> |
|||
<div |
|||
v-for="(item, index) in sceneList" |
|||
:key="index" |
|||
:class="{'scene-list-item-select':item.sceneId == sceneSelectId}" |
|||
class="scene-list-item" |
|||
@click="selectScene(item, index)"> |
|||
{{ item.name }} |
|||
</div> |
|||
</div> |
|||
<div> |
|||
<flexbox |
|||
class="handle-button" |
|||
@click.native="addScene"> |
|||
<img |
|||
class="handle-button-icon" |
|||
src="@/assets/img/scene_add.png" > |
|||
<div class="handle-button-name">新建场景</div> |
|||
</flexbox> |
|||
<flexbox |
|||
class="handle-button" |
|||
@click.native="setScene"> |
|||
<img |
|||
class="handle-button-icon" |
|||
src="@/assets/img/scene_set.png" > |
|||
<div class="handle-button-name">管理</div> |
|||
</flexbox> |
|||
</div> |
|||
|
|||
</div> |
|||
</template> |
|||
|
|||
<script type="text/javascript"> |
|||
// import crmTypeModel from '@/views/ux/model/crmTypeModel' |
|||
import { mapGetters } from 'vuex' |
|||
import { crmSceneIndex } from '@/api/ux/common' |
|||
|
|||
export default { |
|||
name: 'SceneList', // 客户管理下 重要提醒 回款计划提醒 |
|||
components: {}, |
|||
props: { |
|||
/** 没有值就是全部类型 有值就是当个类型 */ |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
// 场景列表 |
|||
sceneSelectId: -1, |
|||
sceneList: [] |
|||
} |
|||
}, |
|||
computed: { |
|||
// ...mapGetters(['crm']) |
|||
}, |
|||
watch: {}, |
|||
mounted() { |
|||
this.getSceneList() |
|||
}, |
|||
methods: { |
|||
getSceneList() { |
|||
crmSceneIndex() |
|||
.then(res => { |
|||
const defaultScenes = res.data.filter(function(item, index) { |
|||
return item.isDefault === 1 |
|||
}) |
|||
|
|||
if (defaultScenes && defaultScenes.length > 0) { |
|||
const defaultScene = defaultScenes[0] |
|||
this.sceneSelectId = defaultScene.sceneId |
|||
this.$emit('scene', { |
|||
id: defaultScene.sceneId, |
|||
name: defaultScene.name, |
|||
bydata: defaultScene.bydata || '' |
|||
}) |
|||
} else { |
|||
this.sceneSelectId = '' |
|||
this.$emit('scene', { id: '', name: '', bydata: '' }) |
|||
} |
|||
|
|||
this.sceneList = res.data |
|||
}) |
|||
.catch(() => { |
|||
this.$emit('scene', { id: '', name: '', bydata: '' }) |
|||
}) |
|||
}, |
|||
|
|||
// 选择场景、 |
|||
selectScene(item, index) { |
|||
this.sceneSelectId = item.sceneId |
|||
this.$emit('scene', { |
|||
id: item.sceneId, |
|||
name: item.name, |
|||
bydata: item.bydata |
|||
}) |
|||
this.$emit('hidden-scene') |
|||
}, |
|||
// 添加场景 |
|||
addScene() { |
|||
this.$emit('scene-handle', { type: 'add' }) |
|||
}, |
|||
// 设置场景 |
|||
setScene() { |
|||
this.$emit('scene-handle', { type: 'set' }) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style rel="stylesheet/scss" lang="scss" scoped> |
|||
.scene-container { |
|||
position: relative; |
|||
width: 150px; |
|||
} |
|||
|
|||
.scene-list { |
|||
max-height: 240px; |
|||
overflow-y: auto; |
|||
font-size: 12px; |
|||
.scene-list-item { |
|||
color: #333; |
|||
padding: 10px 15px; |
|||
cursor: pointer; |
|||
background-color: white; |
|||
} |
|||
.scene-list-item:hover { |
|||
background-color: #1682e6; |
|||
color:#f7f8fa; |
|||
} |
|||
|
|||
.scene-list-item-select { |
|||
color: #f7f8fa; |
|||
background-color: #1682e6; |
|||
} |
|||
} |
|||
|
|||
.handle-button { |
|||
padding: 10px 20px; |
|||
cursor: pointer; |
|||
.handle-button-icon { |
|||
display: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
margin-right: 8px; |
|||
} |
|||
.handle-button-name { |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
.handle-button:hover { |
|||
color: #3E84E9; |
|||
} |
|||
</style> |
@ -0,0 +1,648 @@ |
|||
<template> |
|||
<el-dialog |
|||
:visible.sync="visible" |
|||
:append-to-body="true" |
|||
title="场景管理" |
|||
width="700px" |
|||
@close="handleCancel"> |
|||
<div class="scene-name">您可通过拖拽管理标签</div> |
|||
<flexbox class="scene-list"> |
|||
<div class="scene-list-box"> |
|||
<flexbox class="scene-list-head"> |
|||
<el-checkbox |
|||
:indeterminate="isleftIndeterminate" |
|||
v-model="checkleftAll" |
|||
@change="handleleftCheckAllChange"/> |
|||
<div class="scene-list-head-name">显示的标签</div> |
|||
<div class="scene-list-head-detail">{{ leftCheckItems.length + '/' + checkedLeftData.length }}</div> |
|||
</flexbox> |
|||
<div class="scene-list-body"> |
|||
<flexbox |
|||
v-for="(item, index) in checkedLeftData" |
|||
v-if="item.isSystem == 1" |
|||
:key="index" |
|||
class="list-item"> |
|||
<div |
|||
:class="{'default-mark-active': item.sceneId == defaultId}" |
|||
class="default-mark"/> |
|||
<el-checkbox |
|||
v-model="item.check" |
|||
:disabled="true" |
|||
class="list-item-check" |
|||
@change="leftCheckItemChange"/> |
|||
<div class="list-item-name">{{ item.name }}</div> |
|||
<div class="list-item-handle"> |
|||
<el-dropdown |
|||
trigger="click" |
|||
@command="defaultHandle"> |
|||
<i |
|||
class="el-icon-arrow-down" |
|||
@click="itemHandle('default', item, index)"/> |
|||
<el-dropdown-menu slot="dropdown"> |
|||
<el-dropdown-item>设置为默认标签</el-dropdown-item> |
|||
</el-dropdown-menu> |
|||
</el-dropdown> |
|||
</div> |
|||
</flexbox> |
|||
<draggable |
|||
v-model="checkedLeftData" |
|||
:move="leftMove" |
|||
:options="{group: 'list',forceFallback:false, fallbackClass:'draggingStyle'}" |
|||
style="min-height: 100px;" |
|||
@end="leftMoveEnd"> |
|||
<flexbox |
|||
v-for="(item, index) in checkedLeftData" |
|||
v-if="item.isSystem != 1" |
|||
:key="index" |
|||
class="list-item"> |
|||
<div |
|||
:class="{'default-mark-active': item.sceneId == defaultId}" |
|||
class="default-mark"/> |
|||
<el-checkbox |
|||
v-model="item.check" |
|||
class="list-item-check" |
|||
@change="leftCheckItemChange"/> |
|||
<div class="list-item-name">{{ item.name }}</div> |
|||
<div class="list-item-handle"> |
|||
<i |
|||
class="el-icon-edit" |
|||
@click="itemHandle('edit', item, index)"/> |
|||
<i |
|||
class="el-icon-delete" |
|||
@click="itemHandle('delete', item, index)"/> |
|||
<el-dropdown @command="defaultHandle"> |
|||
<i |
|||
class="el-icon-arrow-down" |
|||
@click="itemHandle('default', item, index)"/> |
|||
<el-dropdown-menu slot="dropdown"> |
|||
<el-dropdown-item>设置为默认标签</el-dropdown-item> |
|||
</el-dropdown-menu> |
|||
</el-dropdown> |
|||
</div> |
|||
</flexbox> |
|||
</draggable> |
|||
|
|||
</div> |
|||
</div> |
|||
<div class="scene-middle-list"> |
|||
<el-button |
|||
:class="{'scene-middle-button-select':rightCheckItems.length > 0}" |
|||
:disabled="rightCheckItems.length == 0" |
|||
class="scene-middle-left-button" |
|||
@click="changePositon('left')"> |
|||
<i class="el-icon-arrow-left scene-middle-icon"/> |
|||
</el-button> |
|||
<el-button |
|||
:class="{'scene-middle-button-select':leftCheckItems.length > 0}" |
|||
:disabled="leftCheckItems.length == 0" |
|||
class="scene-middle-right-button" |
|||
@click="changePositon('right')"> |
|||
<i class="el-icon-arrow-right scene-middle-icon"/> |
|||
</el-button> |
|||
</div> |
|||
<div class="scene-list-box"> |
|||
<flexbox class="scene-list-head"> |
|||
<el-checkbox |
|||
:indeterminate="isrightIndeterminate" |
|||
v-model="checkrightAll" |
|||
@change="handlerightCheckAllChange"/> |
|||
<div class="scene-list-head-name">隐藏的标签</div> |
|||
<div class="scene-list-head-detail">{{ rightCheckItems.length + '/' + checkedRightData.length }}</div> |
|||
</flexbox> |
|||
<div class="scene-list-body"> |
|||
<draggable |
|||
v-model="checkedRightData" |
|||
:move="rightMove" |
|||
:options="{group: 'list',forceFallback:false, fallbackClass:'draggingStyle'}" |
|||
style="min-height: 100px;" |
|||
@end="rightMoveEnd"> |
|||
<flexbox |
|||
v-for="(item, index) in checkedRightData" |
|||
:key="index" |
|||
class="list-item"> |
|||
<el-checkbox |
|||
v-model="item.check" |
|||
style="margin-left:9px;" |
|||
class="list-item-check" |
|||
@change="rightCheckItemChange"/> |
|||
<div class="list-item-name">{{ item.name }}</div> |
|||
</flexbox> |
|||
</draggable> |
|||
</div> |
|||
</div> |
|||
</flexbox> |
|||
<div class="handle-bar"> |
|||
<div |
|||
class="handle-bar-add" |
|||
@click="addAndEditScene('add',{})">+ 新建场景</div> |
|||
<div class="handle-bar-save"> |
|||
<el-button @click.native="handleCancel">取消</el-button> |
|||
<el-button |
|||
type="primary" |
|||
@click.native="handleConfirm">保存</el-button> |
|||
</div> |
|||
</div> |
|||
<scene-create |
|||
:field-list="fieldList" |
|||
:crm-type="crmType" |
|||
:dialog-visible.sync="showCreateScene" |
|||
:obj="filterObj" |
|||
:name="filterName" |
|||
:edit_id="filterEditId" |
|||
:is-default="filterDefault" |
|||
@saveSuccess="getSceneList"/> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script type="text/javascript"> |
|||
// import crmTypeModel from '@/views/ux/model/crmTypeModel' |
|||
// import { |
|||
// crmSceneSetIndex, |
|||
// crmSceneSort, |
|||
// crmSceneDefaults, |
|||
// crmSceneDelete, |
|||
// filterIndexfields |
|||
// } from '@/api/customermanagement/common' |
|||
import draggable from 'vuedraggable' |
|||
import SceneCreate from './SceneCreate' // 新建编辑场景 |
|||
|
|||
export default { |
|||
name: 'SceneSet', // 场景 设置 |
|||
components: { |
|||
draggable, |
|||
SceneCreate |
|||
}, |
|||
props: { |
|||
dialogVisible: { |
|||
type: Boolean, |
|||
required: true, |
|||
default: false |
|||
}, |
|||
/** 没有值就是全部类型 有值就是当个类型 */ |
|||
crmType: { |
|||
type: String, |
|||
default: '' |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
defaultId: '', // 默认场景id |
|||
visible: false, // 控制展示 |
|||
isleftIndeterminate: false, // 标注头部是多选框效果 |
|||
checkleftAll: false, // 关联全选操作多选框 |
|||
|
|||
checkedLeftData: [], // 数据源 |
|||
leftCheckItems: [], // 选择的数据源 |
|||
|
|||
isrightIndeterminate: false, |
|||
checkrightAll: false, |
|||
|
|||
checkedRightData: [], |
|||
rightCheckItems: [], |
|||
|
|||
moveItem: {}, // 移动中的item |
|||
handlDefaultItem: {}, // 设置默认的中间item |
|||
|
|||
/** 添加 编辑 场景 */ |
|||
showCreateScene: false, // 展示场景添加 |
|||
fieldList: [], |
|||
filterObj: { form: [] }, // 筛选确定数据 |
|||
filterName: '', |
|||
filterDefault: false, |
|||
filterEditId: '' // 编辑id |
|||
} |
|||
}, |
|||
computed: {}, |
|||
watch: { |
|||
dialogVisible: { |
|||
handler(val) { |
|||
this.visible = val |
|||
if (val) { |
|||
this.getSceneList() |
|||
} |
|||
}, |
|||
deep: true, |
|||
immediate: true |
|||
} |
|||
}, |
|||
mounted() {}, |
|||
methods: { |
|||
getSceneList() { |
|||
// crmSceneSetIndex({ |
|||
// type: crmTypeModel[this.crmType] |
|||
// }) |
|||
// .then(res => { |
|||
// this.checkedLeftData = res.data.value.map(function(item, index) { |
|||
// item.check = false |
|||
// return item |
|||
// }) |
|||
// this.checkedRightData = res.data.hide_value.map(function( |
|||
// item, |
|||
// index |
|||
// ) { |
|||
// item.check = false |
|||
// return item |
|||
// }) |
|||
// var defaultScene = this.checkedLeftData.filter(function(item, index) { |
|||
// return item.isDefault == 1 |
|||
// }) |
|||
// // 如果有默认场景 |
|||
// if (defaultScene && defaultScene.length > 0) { |
|||
// this.defaultId = defaultScene[0].sceneId |
|||
// } else { |
|||
// this.defaultId = '' |
|||
// } |
|||
// }) |
|||
// .catch(() => {}) |
|||
}, |
|||
/** |
|||
* 确定选择 |
|||
*/ |
|||
handleConfirm() { |
|||
// 如果选择默认的 不包含在左侧列表 重置为没有默认 |
|||
var self = this |
|||
var leftTemps = this.checkedLeftData.filter(function(item, index) { |
|||
return item.sceneId == self.defaultId |
|||
}) |
|||
if (leftTemps.length == 0) { |
|||
this.defaultId = '' |
|||
} |
|||
// crmSceneSort({ |
|||
// type: crmTypeModel[this.crmType], |
|||
// noHideIds: this.checkedLeftData |
|||
// .map(function(item, index, array) { |
|||
// return item.sceneId |
|||
// }) |
|||
// .join(','), |
|||
// hideIds: this.checkedRightData |
|||
// .map(function(item, index, array) { |
|||
// return item.sceneId |
|||
// }) |
|||
// .join(',') |
|||
// }) |
|||
// .then(res => { |
|||
// this.$message({ |
|||
// type: 'success', |
|||
// message: '操作成功' |
|||
// }) |
|||
// this.handleCancel() |
|||
// this.$emit('save-success') |
|||
// }) |
|||
// .catch(() => {}) |
|||
}, |
|||
/** 事项操作 */ |
|||
itemHandle(type, item, index) { |
|||
if (type == 'edit') { |
|||
this.addAndEditScene('edit', item) |
|||
} else if (type == 'delete') { |
|||
this.$confirm('您确定要删除这一条数据吗?', '提示', { |
|||
confirmButtonText: '确定', |
|||
cancelButtonText: '取消', |
|||
type: 'warning' |
|||
}) |
|||
.then(() => { |
|||
crmSceneDelete({ |
|||
sceneId: item.sceneId |
|||
}) |
|||
.then(res => { |
|||
this.$message({ |
|||
type: 'success', |
|||
message: '删除成功' |
|||
}) |
|||
this.checkedLeftData.splice(index, 1) |
|||
this.leftCheckItemChange() |
|||
this.$emit('save-success') |
|||
}) |
|||
.catch(() => {}) |
|||
}) |
|||
.catch(() => { |
|||
this.$message({ |
|||
type: 'info', |
|||
message: '已取消删除' |
|||
}) |
|||
}) |
|||
} else if (type == 'default') { |
|||
this.handlDefaultItem = item |
|||
} |
|||
}, |
|||
/** 操作默认 */ |
|||
defaultHandle() { |
|||
crmSceneDefaults({ |
|||
sceneId: this.handlDefaultItem.sceneId |
|||
}) |
|||
.then(res => { |
|||
this.$message({ |
|||
type: 'success', |
|||
message: '操作成功' |
|||
}) |
|||
this.defaultId = this.handlDefaultItem.sceneId |
|||
}) |
|||
.catch(() => {}) |
|||
}, |
|||
/** 添加编辑场景 */ |
|||
addAndEditScene(type, data) { |
|||
// filterIndexfields({ |
|||
// label: crmTypeModel[this.crmType] |
|||
// }) |
|||
// .then(res => { |
|||
// this.fieldList = res.data |
|||
// if (type == 'edit') { |
|||
// this.filterObj = { form: [], obj: data.data } |
|||
// this.filterName = data.name |
|||
// this.filterDefault = data.isDefault == 1 |
|||
// this.filterEditId = data.sceneId.toString() |
|||
// } else { |
|||
// this.filterObj = { form: [] } |
|||
// this.filterEditId = '' |
|||
// this.filterName = '' |
|||
// this.filterDefault = false |
|||
// } |
|||
// this.showCreateScene = true |
|||
// }) |
|||
// .catch(() => {}) |
|||
}, |
|||
/** |
|||
* 取消选择 |
|||
*/ |
|||
handleCancel() { |
|||
this.visible = false |
|||
this.$emit('update:dialogVisible', false) |
|||
}, |
|||
/** 拖拽操作 */ |
|||
rightMoveEnd(evt) { |
|||
this.moveItem.check = false |
|||
this.leftCheckItemChange() |
|||
this.rightCheckItemChange() |
|||
}, |
|||
rightMove(obj) { |
|||
this.moveItem = obj.draggedContext.element |
|||
}, |
|||
leftMoveEnd(evt) { |
|||
this.moveItem.check = false |
|||
this.leftCheckItemChange() |
|||
this.rightCheckItemChange() |
|||
}, |
|||
leftMove(obj) { |
|||
this.moveItem = obj.draggedContext.element |
|||
}, |
|||
// 选择全部 |
|||
handleleftCheckAllChange(value) { |
|||
if (value) { |
|||
this.isleftIndeterminate = false |
|||
} |
|||
this.checkedLeftData = this.checkedLeftData.filter(function( |
|||
item, |
|||
index, |
|||
array |
|||
) { |
|||
item.check = value |
|||
return item |
|||
}) |
|||
this.leftCheckItems = value ? this.checkedLeftData : [] |
|||
}, |
|||
leftCheckItemChange() { |
|||
this.leftCheckItems = this.checkedLeftData.filter(function( |
|||
item, |
|||
index, |
|||
array |
|||
) { |
|||
return item.check == true |
|||
}) |
|||
if (this.leftCheckItems.length > 0) { |
|||
if (this.leftCheckItems.length == this.checkedLeftData.length) { |
|||
this.checkleftAll = true |
|||
this.isleftIndeterminate = false |
|||
} else { |
|||
this.checkleftAll = false |
|||
this.isleftIndeterminate = true |
|||
} |
|||
} else { |
|||
this.checkleftAll = false |
|||
this.isleftIndeterminate = false |
|||
} |
|||
}, |
|||
// 选择全部 |
|||
handlerightCheckAllChange(value) { |
|||
if (value) { |
|||
this.isrightIndeterminate = false |
|||
} |
|||
this.checkedRightData = this.checkedRightData.filter(function( |
|||
item, |
|||
index, |
|||
array |
|||
) { |
|||
item.check = value |
|||
return item |
|||
}) |
|||
this.rightCheckItems = value ? this.checkedRightData : [] |
|||
}, |
|||
rightCheckItemChange() { |
|||
this.rightCheckItems = this.checkedRightData.filter(function( |
|||
item, |
|||
index, |
|||
array |
|||
) { |
|||
return item.check == true |
|||
}) |
|||
if (this.rightCheckItems.length > 0) { |
|||
if (this.rightCheckItems.length == this.checkedRightData.length) { |
|||
this.checkrightAll = true |
|||
this.isrightIndeterminate = false |
|||
} else { |
|||
this.checkrightAll = false |
|||
this.isrightIndeterminate = true |
|||
} |
|||
} else { |
|||
this.checkrightAll = false |
|||
this.isrightIndeterminate = false |
|||
} |
|||
}, |
|||
// 按钮操作 |
|||
changePositon(type) { |
|||
var self = this |
|||
// 从右往左 |
|||
if (type == 'left') { |
|||
this.checkedRightData = this.checkedRightData.filter(function( |
|||
item, |
|||
index, |
|||
array |
|||
) { |
|||
var remove = false |
|||
self.rightCheckItems.forEach(function(element, index) { |
|||
if (item.sceneId == element.sceneId) { |
|||
remove = true |
|||
} |
|||
}) |
|||
return !remove |
|||
}) |
|||
|
|||
this.rightCheckItems.forEach(function(element, index) { |
|||
element.check = false |
|||
self.checkedLeftData.push(element) |
|||
}) |
|||
|
|||
this.rightCheckItems = [] |
|||
this.isrightIndeterminate = false |
|||
this.checkrightAll = false |
|||
|
|||
// 刷新左侧效果 |
|||
this.leftCheckItemChange() |
|||
this.rightCheckItemChange() |
|||
} else { |
|||
this.checkedLeftData = this.checkedLeftData.filter(function( |
|||
item, |
|||
index, |
|||
array |
|||
) { |
|||
var remove = false |
|||
self.leftCheckItems.forEach(function(element, index) { |
|||
if (item.sceneId == element.sceneId) { |
|||
remove = true |
|||
} |
|||
}) |
|||
return !remove |
|||
}) |
|||
|
|||
this.leftCheckItems.forEach(function(element, index) { |
|||
element.check = false |
|||
self.checkedRightData.push(element) |
|||
}) |
|||
|
|||
this.leftCheckItems = [] |
|||
this.isleftIndeterminate = false |
|||
this.checkleftAll = false |
|||
|
|||
// 刷新右侧效果 |
|||
this.leftCheckItemChange() |
|||
this.rightCheckItemChange() |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style rel="stylesheet/scss" lang="scss" scoped> |
|||
.scene-name { |
|||
font-size: 12px; |
|||
padding-bottom: 5px; |
|||
color: #aaa; |
|||
} |
|||
|
|||
.default-mark { |
|||
width: 4px; |
|||
height: 4px; |
|||
border-radius: 2px; |
|||
margin-right: 5px; |
|||
} |
|||
.default-mark-active { |
|||
background-color:#3E84E9; |
|||
} |
|||
|
|||
.scene-list { |
|||
.scene-list-box { |
|||
flex: 1; |
|||
border: 1px solid #3E84E9; |
|||
border-radius: 2px; |
|||
height: 300px; |
|||
position: relative; |
|||
padding: 15px; |
|||
} |
|||
.scene-middle-list { |
|||
width: 50px; |
|||
text-align: center; |
|||
button { |
|||
border: 1px solid #cccccc; |
|||
width: 34px; |
|||
height: 34px; |
|||
border-radius: 17px; |
|||
background-color: #f5f7fa; |
|||
} |
|||
.scene-middle-icon { |
|||
color: #cccccc; |
|||
font-size: 14px; |
|||
} |
|||
.scene-middle-left-button { |
|||
} |
|||
.scene-middle-right-button { |
|||
margin-top: 15px; |
|||
margin-left: 0; |
|||
} |
|||
|
|||
.scene-middle-button-select { |
|||
border: 1px solid #3E84E9 !important; |
|||
background-color: #3E84E9 !important; |
|||
.scene-middle-icon { |
|||
color: white !important; |
|||
} |
|||
} |
|||
} |
|||
.scene-list-head { |
|||
padding-bottom: 15px; |
|||
padding-left: 9px; |
|||
border-bottom: 1px dashed #3E84E9; |
|||
font-size: 13px; |
|||
.scene-list-head-name { |
|||
color: #333; |
|||
flex: 1; |
|||
margin: 0 8px; |
|||
} |
|||
|
|||
.scene-list-head-detail { |
|||
color: #aaa; |
|||
} |
|||
} |
|||
.scene-list-body { |
|||
padding: 5px 0; |
|||
height: 240px; |
|||
position: relative; |
|||
overflow-y: auto; |
|||
} |
|||
|
|||
.list-item { |
|||
padding: 5px 0; |
|||
cursor: pointer; |
|||
.list-item-check { |
|||
margin-right: 8px; |
|||
} |
|||
.list-item-name { |
|||
font-size: 13px; |
|||
color: #333; |
|||
flex: 1; |
|||
} |
|||
.list-item-handle { |
|||
flex-shrink: 0; |
|||
display: none; |
|||
i { |
|||
color: #aaa; |
|||
font-size: 12px; |
|||
margin-right: 5px; |
|||
} |
|||
i:hover { |
|||
color: #3E84E9; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.list-item:hover { |
|||
.list-item-handle { |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.handle-bar { |
|||
font-size: 12px; |
|||
.handle-bar-add { |
|||
cursor: pointer; |
|||
color: #3e84e9; |
|||
padding: 20px 10px; |
|||
} |
|||
.handle-bar-save { |
|||
position: relative; |
|||
height: 30px; |
|||
button { |
|||
float: right; |
|||
margin-right: 10px; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,73 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-dialogDrag |
|||
:visible.sync="visible" |
|||
:close-on-click-modal="false" |
|||
title="详细信息" |
|||
width="900px" |
|||
height="300px" |
|||
:append-to-body="true"> |
|||
<div |
|||
slot="footer" |
|||
class="dialog-footer"> |
|||
<crm-base-info |
|||
:is="tabName" |
|||
:detail="data" |
|||
:id="id" |
|||
:crm-type="crmType"> |
|||
</crm-base-info> |
|||
<el-button >取 消</el-button> |
|||
<el-button |
|||
type="primary" |
|||
>确 定</el-button> |
|||
</div> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
import CRMBaseInfo from '../CRMBaseInfo' // 基本信息 |
|||
|
|||
export default { |
|||
name: 'Index', |
|||
components: { |
|||
CRMBaseInfo |
|||
}, |
|||
props: { |
|||
dialogVisible: { |
|||
type: Boolean, |
|||
required: true, |
|||
default: false |
|||
}, |
|||
detailData: {}, |
|||
}, |
|||
data() { |
|||
return{ |
|||
visible: false, |
|||
data:{}, |
|||
tabName:'', |
|||
id: [String, Number], |
|||
} |
|||
}, |
|||
watch: { |
|||
dialogVisible: { |
|||
handler(val) { |
|||
if (val) { |
|||
|
|||
} |
|||
this.visible = this.dialogVisible |
|||
}, |
|||
}, |
|||
detailData:{ |
|||
handler(val) { |
|||
this.data=this.detailData; |
|||
} |
|||
} |
|||
}, |
|||
methods: { |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
|
|||
</style> |
@ -0,0 +1,39 @@ |
|||
//客户相关详情 头部类似布局 |
|||
.el-tabs /deep/ .el-tabs__nav-wrap::after { |
|||
display: none !important; |
|||
} |
|||
|
|||
.el-tabs /deep/ .el-tabs__header { |
|||
background-color: #F5F6F9; |
|||
padding: 0 17px; |
|||
margin: 0 0 15px !important; |
|||
} |
|||
|
|||
.el-tabs /deep/ .el-tabs__item { |
|||
font-size: 13px !important; |
|||
height: 40px !important; |
|||
line-height: 40px !important; |
|||
} |
|||
|
|||
.d-container { |
|||
position: relative; |
|||
height: 100%; |
|||
} |
|||
|
|||
/** 让element 查询到的标签 */ |
|||
.t-loading-content { |
|||
position: relative; |
|||
overflow-y: scroll; |
|||
flex: 1; |
|||
} |
|||
|
|||
/** 审核信息 */ |
|||
.examine-info { |
|||
padding: 0 17px 17px 17px; |
|||
|
|||
.examine-info-border { |
|||
border: 1px solid #e6e6e6; |
|||
border-radius: 3px; |
|||
padding: 17px; |
|||
} |
|||
} |
@ -0,0 +1,111 @@ |
|||
.cr-body-content { |
|||
margin: 2px ; |
|||
position: relative; |
|||
background-color: white; |
|||
overflow-x: auto; |
|||
//border-bottom: 1px solid $xr-border-line-color; |
|||
} |
|||
.el-table .cell { |
|||
white-space: pre-wrap; |
|||
word-wrap: break-word; |
|||
} |
|||
.content-header { |
|||
position: relative; |
|||
padding: 10px 20px; |
|||
.search-container { |
|||
margin: 0 20px; |
|||
width: 200px; |
|||
} |
|||
.create-button { |
|||
position: absolute; |
|||
right: 10px; |
|||
top: 15px; |
|||
} |
|||
} |
|||
|
|||
.right-container { |
|||
margin-right: -10px; |
|||
float: right; |
|||
margin: 2px; |
|||
position: relative; |
|||
.right-item { |
|||
float: left; |
|||
margin-right: 10px; |
|||
padding: 8px 10px; |
|||
font-size: 13px; |
|||
border-radius: 2px; |
|||
} |
|||
|
|||
.right-more-item { |
|||
cursor: pointer; |
|||
border: 1px solid #dcdfe6; |
|||
background-color: white; |
|||
font-size: 13px; |
|||
color: #777; |
|||
padding: 0 12px; |
|||
border-radius: 2px; |
|||
height: 31px; |
|||
} |
|||
} |
|||
|
|||
.el-input { |
|||
display: inline-block; |
|||
|
|||
width: 50%; |
|||
|
|||
input { |
|||
background: transparent; |
|||
border: 0px; |
|||
-webkit-appearance: none; |
|||
border-radius: 0px; |
|||
padding: 12px; |
|||
height: 47px; |
|||
caret-color: #1a1818; |
|||
|
|||
&:-webkit-autofill { |
|||
box-shadow: 0 0 0px 1000px #e5e5e5 inset !important; |
|||
-webkit-text-fill-color: #454545 !important; |
|||
color:#454545 !important; |
|||
} |
|||
} |
|||
} |
|||
|
|||
//表尾 上一页按钮 |
|||
.table-footer { |
|||
padding: 1px 20px; |
|||
} |
|||
|
|||
.el-table /deep/ thead th { |
|||
font-weight: 400; |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.el-table /deep/ tbody tr td { |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.el-table /deep/ thead .el-checkbox { |
|||
display: inline; |
|||
} |
|||
|
|||
body .el-table th.gutter { |
|||
display: table-cell !important; |
|||
} |
|||
|
|||
.el-table /deep/ .el-table__body-wrapper { |
|||
height: calc(100% - 58px) !important; |
|||
} |
|||
|
|||
.el-dropdown-link { |
|||
cursor: pointer; |
|||
color: #409EFF; |
|||
} |
|||
.el-icon-arrow-down { |
|||
font-size: 12px; |
|||
} |
|||
.demonstration { |
|||
display: block; |
|||
color: #8492a6; |
|||
font-size: 14px; |
|||
margin-bottom: 20px; |
|||
} |
@ -0,0 +1,9 @@ |
|||
|
|||
/** 客户管理详情页面的 css 侧滑进入的详情 */ |
|||
.d-view { |
|||
position: fixed; |
|||
width: 60%; |
|||
top: 45px; |
|||
bottom: 0px; |
|||
right: 0px; |
|||
} |
@ -0,0 +1,131 @@ |
|||
/** 附件 */ |
|||
.f-container { |
|||
padding: 0 17px; |
|||
} |
|||
.f-item { |
|||
padding: 3px 0; |
|||
height: 35px; |
|||
.f-img { |
|||
position: block; |
|||
width: 30px; |
|||
height: 30px; |
|||
padding: 0 1px; |
|||
margin-right: 8px; |
|||
} |
|||
.f-name { |
|||
color: #666; |
|||
font-size: 12px; |
|||
margin-right: 10px; |
|||
} |
|||
} |
|||
.xh-files-cont { |
|||
position: relative; |
|||
display: inline-block; |
|||
border-radius: 3px; |
|||
width: 100%; |
|||
border: 1px solid #ddd; |
|||
padding: 3.5px 5px; |
|||
margin: 3px; |
|||
line-height: 15px; |
|||
} |
|||
|
|||
.xh-files-cont.is_disabled { |
|||
background-color: #f5f7fa; |
|||
border-color: #e4e7ed; |
|||
cursor: not-allowed; |
|||
.f-name { |
|||
background-color: #f0f4f8ea; |
|||
color: #c0c4cc; |
|||
cursor: not-allowed; |
|||
} |
|||
} |
|||
|
|||
.xh-files-cont.is_valid:hover { |
|||
border-color: #c0c4cc; |
|||
} |
|||
|
|||
.f-header { |
|||
cursor: pointer; |
|||
padding: 5px 0 5px; |
|||
.f-logo { |
|||
position: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
margin-right: 8px; |
|||
} |
|||
.f-name { |
|||
color: #3e84e9; |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
.f-header.is_disabled { |
|||
cursor: not-allowed; |
|||
} |
|||
|
|||
.f-body { |
|||
.f-item { |
|||
padding: 3px 0; |
|||
height: 25px; |
|||
.f-img { |
|||
position: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
padding: 0 1px; |
|||
margin-right: 8px; |
|||
} |
|||
.f-name { |
|||
color: #666; |
|||
font-size: 12px; |
|||
} |
|||
.close-button { |
|||
cursor: pointer; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.bar-iput { |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
height: 0; |
|||
width: 0; |
|||
opacity: 0; |
|||
} |
|||
|
|||
.b-cont { |
|||
position: relative; |
|||
padding: 0 50px 20px 20px; |
|||
} |
|||
|
|||
.b-cells { |
|||
margin-top: 25px; |
|||
} |
|||
|
|||
.b-cell { |
|||
padding: 0 10px; |
|||
.b-cell-b { |
|||
width: auto; |
|||
padding: 8px; |
|||
.b-cell-name { |
|||
width: 100px; |
|||
margin-top: 13px; |
|||
margin-right: -5px; |
|||
font-size: 13px; |
|||
flex-shrink: 0; |
|||
color: #777; |
|||
} |
|||
.b-cell-value { |
|||
font-size: 13px; |
|||
color: #333; |
|||
white-space: pre-wrap; |
|||
word-wrap: break-word; |
|||
} |
|||
.b-cell-foot { |
|||
flex-shrink: 0; |
|||
display: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
margin-left: 8px; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,170 @@ |
|||
/** 跟进记录相关的 日志 审批任务 日程 项目 公共css */ |
|||
.fl-c { |
|||
background-color: white; |
|||
padding: 10px 20px; |
|||
position: relative; |
|||
} |
|||
|
|||
/** 头部布局 名字 头像 */ |
|||
.fl-h { |
|||
.fl-h-img { |
|||
display: block; |
|||
width: 34px; |
|||
height: 34px; |
|||
border-radius: 17px; |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.fl-h-b { |
|||
flex: 1; |
|||
|
|||
.fl-h-name { |
|||
font-size: 13px; |
|||
color: #333; |
|||
} |
|||
|
|||
.fl-h-time { |
|||
font-size: 12px; |
|||
color: #999; |
|||
margin-top: 3px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** 头部 右侧 布局*/ |
|||
.fl-h-handle { |
|||
width: auto; |
|||
|
|||
.fl-h-handle-name { |
|||
font-size: 13px; |
|||
color: #333; |
|||
margin-right: 6px; |
|||
} |
|||
} |
|||
|
|||
.fl-h-mark { |
|||
width: auto; |
|||
|
|||
.fl-h-mark-img { |
|||
display: block; |
|||
width: 20px; |
|||
height: 20px; |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.fl-h-mark-name { |
|||
font-size: 13px; |
|||
color: #333; |
|||
} |
|||
} |
|||
|
|||
/** 内容区域 */ |
|||
.fl-b { |
|||
margin: 20px 0 0 40px; |
|||
|
|||
.fl-b-content { |
|||
font-size: 13px; |
|||
color: #333; |
|||
margin-bottom: 10px; |
|||
} |
|||
|
|||
.fl-b-images { |
|||
margin-top: 5px; |
|||
width: 310px; |
|||
|
|||
.fl-b-img-item { |
|||
width: 98px; |
|||
height: 98px; |
|||
display: inline-block; |
|||
margin: 0 4px 4px 0; |
|||
background-size: contain; |
|||
background-repeat: no-repeat; |
|||
background-position: center; |
|||
position: relative; |
|||
cursor: pointer; |
|||
} |
|||
} |
|||
|
|||
.fl-b-other { |
|||
margin: 8px 0; |
|||
|
|||
.fl-b-other-name { |
|||
margin: 10px 0; |
|||
color: #666; |
|||
font-size: 13px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.fl-c:before { |
|||
content: " "; |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; |
|||
height: 1px; |
|||
border-top: 1px solid #e5e5e5; |
|||
color: #e5e5e5; |
|||
-webkit-transform-origin: 0 0; |
|||
transform-origin: 0 0; |
|||
-webkit-transform: scaleY(0.5); |
|||
transform: scaleY(0.5); |
|||
left: 15px; |
|||
z-index: 2; |
|||
} |
|||
|
|||
.fl-c:first-child:before { |
|||
display: none; |
|||
} |
|||
|
|||
/** 附件 */ |
|||
.fl-b-files { |
|||
margin-top: 10px; |
|||
} |
|||
|
|||
/** 关联附件 联系人 客户 行布局 */ |
|||
.cell { |
|||
padding: 8px; |
|||
background-color: #F5F7FA; |
|||
border-radius: 2px; |
|||
position: relative; |
|||
|
|||
.cell-head { |
|||
display: block; |
|||
width: 15px; |
|||
height: 15px; |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.cell-body { |
|||
flex: 1; |
|||
color: #333; |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.cell-foot { |
|||
display: block; |
|||
width: 20px; |
|||
padding: 0 4px; |
|||
margin-right: 8px; |
|||
} |
|||
} |
|||
|
|||
.cell:before { |
|||
content: " "; |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; |
|||
height: 1px; |
|||
border-top: 1px solid #e5e5e5; |
|||
color: #e5e5e5; |
|||
-webkit-transform-origin: 0 0; |
|||
transform-origin: 0 0; |
|||
-webkit-transform: scaleY(0.5); |
|||
transform: scaleY(0.5); |
|||
left: 30px; |
|||
z-index: 2; |
|||
} |
|||
|
|||
.cell:first-child:before { |
|||
display: none; |
|||
} |
@ -0,0 +1,86 @@ |
|||
// 跟进记录效果 |
|||
.f-container { |
|||
padding: 0 17px; |
|||
} |
|||
|
|||
/** 发布行css */ |
|||
.se-section { |
|||
position: relative; |
|||
margin: 5px 0; |
|||
height: 40px; |
|||
line-height: 40px; |
|||
|
|||
.se-name { |
|||
font-size: 12px; |
|||
color: #333333; |
|||
margin-right: 5px; |
|||
} |
|||
|
|||
.se-select { |
|||
border: 1px solid #dcdfe6; |
|||
font-size: 12px; |
|||
color: #606266; |
|||
padding: 0 8px; |
|||
border-radius: 2px; |
|||
font-weight: 500; |
|||
height: 25px; |
|||
|
|||
.se-select-name { |
|||
margin-right: 20px; |
|||
} |
|||
} |
|||
|
|||
.se-datepicker { |
|||
font-size: 12px; |
|||
width: 200px; |
|||
margin-right: 20px; |
|||
} |
|||
|
|||
.se-send { |
|||
position: absolute; |
|||
right: 0; |
|||
padding: 5px 15px; |
|||
} |
|||
} |
|||
|
|||
.el-date-editor /deep/ .el-input__inner { |
|||
height: 25px; |
|||
line-height: 25px; |
|||
} |
|||
|
|||
.el-date-editor /deep/ .el-input__icon { |
|||
height: 25px; |
|||
line-height: 25px; |
|||
} |
|||
|
|||
.el-checkbox /deep/ .el-checkbox__label { |
|||
font-size: 12px; |
|||
color: #333333; |
|||
} |
|||
|
|||
.log-cont { |
|||
margin: 0px 0; |
|||
border: 1px solid #e6e6e6; |
|||
border-radius: 2px; |
|||
|
|||
.log-tabs-item { |
|||
font-size: 13px; |
|||
padding: 8px 15px; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.log-tabs-item:hover { |
|||
color: #F18C70 !important; |
|||
} |
|||
|
|||
.log-tabs-line { |
|||
height: 10px; |
|||
background-color: #e6e6e6; |
|||
width: 2px; |
|||
} |
|||
} |
|||
|
|||
.log-items { |
|||
min-height: 400px; |
|||
position: relative; |
|||
} |
@ -0,0 +1,29 @@ |
|||
/**客户下相关信息 table 效果 */ |
|||
.rc-cont { |
|||
position: relative; |
|||
padding: 0 20px 20px 20px; |
|||
.rc-head { |
|||
margin-bottom: 15px; |
|||
position: relative; |
|||
.rc-head-item { |
|||
font-size: 12px; |
|||
padding: 8px 5px; |
|||
border-radius: 2px; |
|||
margin-right: 20px; |
|||
margin-left: 0px; |
|||
} |
|||
.rc-head-item:first-child { |
|||
margin-right: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.el-table /deep/ thead th{ |
|||
background-color: #F5F5F5; |
|||
font-weight: 400; |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.el-table /deep/ tbody{ |
|||
font-size: 13px; |
|||
} |
@ -0,0 +1,129 @@ |
|||
@import './detailview.scss'; |
|||
|
|||
.crm-container { |
|||
background-color: white; |
|||
border: 1px solid #E6E6E6; |
|||
border-radius: 2px; |
|||
} |
|||
|
|||
/** |
|||
.el-table /deep/ thead th { |
|||
border-right: 1px solid #ebeef5; |
|||
} |
|||
|
|||
.el-table /deep/ tbody tr td:nth-child(2){ |
|||
border-right: 1px solid #ebeef5; |
|||
} |
|||
|
|||
.b-bottom { |
|||
border-bottom: 1px solid #ebeef5; |
|||
} |
|||
*/ |
|||
|
|||
.el-table /deep/ thead th { |
|||
//background-color: #fafdff; |
|||
//font-weight: 400; |
|||
//border-color: #E6E6E6; |
|||
//color: #475059; |
|||
background-color: #61687a; |
|||
font-weight: 400; |
|||
border-color: #fff; |
|||
color: #fff; |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.table-set { |
|||
width: 15px; |
|||
margin-top: 5px; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.table-head-name { |
|||
font-size: 14px; |
|||
color: #475059; |
|||
line-height: 23px; |
|||
padding: 0; |
|||
} |
|||
|
|||
.el-table /deep/ thead .cell { |
|||
height: 23px; |
|||
} |
|||
|
|||
.el-table /deep/ .el-table__row.current-row { |
|||
td:first-child::before { |
|||
content: ' '; |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
bottom: 0; |
|||
width: 2px; |
|||
background-color: #5383ED; |
|||
} |
|||
} |
|||
|
|||
.el-table /deep/ tbody tr td { |
|||
border-top-color: transparent; |
|||
border-left-color: transparent; |
|||
border-right-color: transparent; |
|||
border-bottom-color: #E6E6E6; |
|||
font-size: 13px; |
|||
} |
|||
|
|||
.el-table /deep/ tbody tr td:nth-child(2) { |
|||
border-right: 1px solid #E6E6E6; |
|||
} |
|||
|
|||
.n-table--border { |
|||
border-color: #E6E6E6; |
|||
border-left-color: transparent; |
|||
border-right-color: transparent; |
|||
} |
|||
|
|||
.n-table--border::after { |
|||
display: none; |
|||
} |
|||
|
|||
.p-contianer { |
|||
position: relative; |
|||
background-color: white; |
|||
height: 44px; |
|||
|
|||
.p-bar { |
|||
float: right; |
|||
margin: 5px 100px 0 0; |
|||
font-size: 14px !important; |
|||
} |
|||
} |
|||
|
|||
// 列表状态 |
|||
.status_button { |
|||
padding: 1px 6px; |
|||
border: 1px solid #e6e6e6; |
|||
border-radius: 4px; |
|||
display: inline-block; |
|||
font-size: 12px; |
|||
margin: 0 auto; |
|||
} |
|||
|
|||
.el-table /deep/ .sort-caret.ascending { |
|||
top: 0px; |
|||
} |
|||
.el-table /deep/ .sort-caret.descending{ |
|||
bottom: 2px; |
|||
} |
|||
.el-table /deep/ .caret-wrapper { |
|||
height: 24px; |
|||
} |
|||
|
|||
.el-table /deep/ .warning-row { |
|||
background: #e3ecf3; |
|||
} |
|||
.el-table /deep/ .success-row { |
|||
background: #f4f8fd; |
|||
} |
|||
.el-table /deep/ thead { |
|||
background: #61687a; |
|||
} |
|||
.el-table /deep/ th.gutter { |
|||
display: table-cell!important; |
|||
} |
Loading…
Reference in new issue