After Width: | Height: | Size: 503 B |
After Width: | Height: | Size: 747 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 349 B |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 598 B |
After Width: | Height: | Size: 527 B |
After Width: | Height: | Size: 405 B |
After Width: | Height: | Size: 714 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 549 B |
After Width: | Height: | Size: 697 B |
After Width: | Height: | Size: 456 B |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 364 B |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 303 B |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 822 B |
After Width: | Height: | Size: 615 B |
After Width: | Height: | Size: 697 B |
After Width: | Height: | Size: 565 B |
After Width: | Height: | Size: 589 B |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 505 B |
After Width: | Height: | Size: 426 B |
After Width: | Height: | Size: 590 B |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 8.6 KiB |
After Width: | Height: | Size: 8.7 KiB |
After Width: | Height: | Size: 365 B |
After Width: | Height: | Size: 394 B |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 13 KiB |
@ -0,0 +1,7 @@ |
||||
/* 仿钉钉流程图插件 */ |
||||
import DrawFlow from "./src/DrawFlow"; |
||||
/* istanbul ignore next */ |
||||
DrawFlow.install = function(Vue) { |
||||
Vue.component(DrawFlow.name, DrawFlow); |
||||
}; |
||||
export default DrawFlow; |
@ -0,0 +1,349 @@ |
||||
<!-- |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec 生成流程绘制 基本节点(审批 抄送)组装逻辑 |
||||
* 组装 |
||||
--> |
||||
<script> |
||||
import AddNodeBtn from "@/components/DrawFlow/src/components/AddNodeBtn"; |
||||
import RowFactory from "@/components/DrawFlow/src/components/DrawRow/FactoryRow"; |
||||
// import EventBus from "@/components/ApprovalProcess/ProcessDesign/components/EventBus/EventBus"; |
||||
|
||||
import { |
||||
RowNode, |
||||
ConditionNode, |
||||
CopyNode |
||||
} from "./components/NodeConfigFactory/NodeFactory"; |
||||
// import { deepClone } from "@/common/utils"; |
||||
import FlowFactory from "./components/factory"; |
||||
import { HashCode, transToTreeDat, getPidArr , deepClone } from "./utils"; |
||||
import FlowNode from "@/components/DrawFlow/src/components/DrawRow/FlowNode"; |
||||
export default { |
||||
name: "FactoryDrawFlow", |
||||
components: { |
||||
AddNodeBtn, |
||||
FlowNode |
||||
}, |
||||
created() { |
||||
this.init(); |
||||
// this.creatBusNodeChange(); // 可用事件派发 |
||||
}, |
||||
props: { |
||||
FlowConfig: {// 接受的数据 |
||||
type: Array, |
||||
default() { |
||||
return []; |
||||
} |
||||
} |
||||
}, |
||||
data() { |
||||
return { |
||||
rectTypeDic: { |
||||
1: "审批节点", |
||||
2: "规则节点23", |
||||
3: "抄送人", |
||||
4: "开始节点" |
||||
}, |
||||
isColList: ["3", "5"], |
||||
selfConfig: null, |
||||
currentNode: null |
||||
}; |
||||
}, |
||||
methods: { |
||||
// 节点数据变化事件 |
||||
nodeChange(node) { |
||||
this.currentNode.title = node.title; |
||||
this.selfConfig.forEach(i => { |
||||
if (i.id === this.currentNode.id) { |
||||
i.data = node.data; |
||||
i.title = node.title; |
||||
} |
||||
}); |
||||
this.$forceUpdate(); |
||||
}, |
||||
/** |
||||
* 添加条件框 |
||||
*/ |
||||
addBranch(node) { |
||||
let newNode = new CopyNode(node[0]); |
||||
this.selfConfig = this.selfConfig.concat([newNode]); |
||||
}, |
||||
creatBusNodeChange() { |
||||
// EventBus.$on("nodeChange", this.nodeChange); |
||||
}, |
||||
/** |
||||
* 获取传参数据结构 |
||||
*/ |
||||
getResData() { |
||||
let list = JSON.parse(JSON.stringify(this.selfConfig)); |
||||
getPidArr(list); |
||||
return list; |
||||
}, |
||||
/** |
||||
* 初始化 数据私有化 |
||||
*/ |
||||
init() { |
||||
this.selfConfig = deepClone(this.FlowConfig); |
||||
}, |
||||
/** |
||||
* @param data 源数组一维数组 |
||||
* @requires tree 二维数组 |
||||
*/ |
||||
transformTree(data) { |
||||
return transToTreeDat(data); |
||||
}, |
||||
clickSelectBox(nextNode) { |
||||
let { node, selfConfig } = this.getNodeFactory(nextNode); |
||||
this.selfConfig = selfConfig.concat(node); |
||||
}, |
||||
/** |
||||
* 根据isRow去判断row或者rol |
||||
*/ |
||||
getNodeFactory(nextNode) { |
||||
if (!nextNode.isRow) { |
||||
let { node, selfConfig } = this.getColNode(nextNode); |
||||
return { node, selfConfig }; |
||||
} else { |
||||
let { node, selfConfig } = this.getRowNode(nextNode); |
||||
return { node, selfConfig }; |
||||
} |
||||
}, |
||||
/** |
||||
* 获取row节点 |
||||
*/ |
||||
getRowNode(nextNode) { |
||||
let node = [new RowNode(nextNode)]; |
||||
let selfConfig = this.repickArr(node[0]); |
||||
this.clickNode(node[0]); |
||||
return { node, selfConfig }; |
||||
}, |
||||
/** |
||||
* 获取col节点 |
||||
*/ |
||||
getColNode(nextNode) { |
||||
let groupId = HashCode(); |
||||
let node = [ |
||||
new ConditionNode({ groupId, ...nextNode }), |
||||
new ConditionNode({ groupId, ...nextNode }) |
||||
]; |
||||
let repickConfig = { |
||||
groupId: node[0].groupPid, |
||||
id: node[0].id |
||||
}; |
||||
let selfConfig = this.repickArr(repickConfig); |
||||
this.locationScroll(); |
||||
return { node, selfConfig }; |
||||
}, |
||||
/** |
||||
* 定位滚动条 |
||||
*/ |
||||
locationScroll() { |
||||
// window.location.hash = ".bottom-right-cover-line"; |
||||
let el = document.getElementsByClassName("dingflow-design")[0]; |
||||
setTimeout(() => { |
||||
el.scrollLeft = el.scrollWidth - el.clientWidth + 340; |
||||
}, 0); |
||||
}, |
||||
/** |
||||
* 重定位数组 |
||||
*/ |
||||
repickArr(repickConfig) { |
||||
let selfConfig = JSON.parse(JSON.stringify(this.selfConfig)); |
||||
selfConfig.forEach(i => { |
||||
if (i.isRow) { |
||||
if (i.groupId === repickConfig.groupId) { |
||||
i.groupId = repickConfig.id; |
||||
} |
||||
} else { |
||||
if (i.groupPid === repickConfig.groupId) { |
||||
i.groupPid = repickConfig.id; |
||||
} |
||||
} |
||||
}); |
||||
return selfConfig; |
||||
}, |
||||
// 点击节点 |
||||
clickNode(nodeConfig) { |
||||
this.currentNode = nodeConfig; |
||||
this.$emit("clickNode", nodeConfig); |
||||
}, |
||||
//点击关闭节点 |
||||
closeNode(node) { |
||||
let repickConfig = {}; |
||||
if (node.isRow) { |
||||
repickConfig.groupId = node.groupId; |
||||
repickConfig.id = node.id; |
||||
let selfConfig = JSON.parse(JSON.stringify(this.selfConfig)); |
||||
this.selfConfig = this.deleteNode(selfConfig, node); |
||||
} else { |
||||
repickConfig.groupId = node.groupPid; |
||||
repickConfig.id = node.groupId; |
||||
this.selfConfig = this.deleteColNode(node); |
||||
} |
||||
this.selfConfig = this.repickDeleteArr(repickConfig); |
||||
}, |
||||
// 删除节点 |
||||
deleteNode(selfConfig, node) { |
||||
selfConfig = selfConfig.map(i => i.id !== node.id && i).filter(Boolean); |
||||
return selfConfig; |
||||
}, |
||||
//单独删除col下node |
||||
deleteColNode(node) { |
||||
let selfConfig = JSON.parse(JSON.stringify(this.selfConfig)); |
||||
let nodeArr = selfConfig.filter( |
||||
i => i.groupId === node.groupId && !i.isRow |
||||
); |
||||
let deleteArr = []; |
||||
if (nodeArr.length > 2) { |
||||
//递归删除所有关联子节点 |
||||
deleteArr = [node]; |
||||
this.deleteLoop(selfConfig, node, deleteArr); |
||||
} else { |
||||
//删除整个group |
||||
let allCol = selfConfig |
||||
.map(i => i.groupId === node.groupId && !i.isRow && i) |
||||
.filter(Boolean); |
||||
deleteArr = allCol; |
||||
allCol.forEach(i => { |
||||
this.deleteLoop(selfConfig, i, deleteArr); |
||||
}); |
||||
} |
||||
deleteArr.forEach(i => { |
||||
selfConfig = this.deleteNode(selfConfig, i); |
||||
}); |
||||
return selfConfig; |
||||
}, |
||||
// 循环遍历删除组下关联节点 |
||||
deleteLoop(selfConfig, node, deleteArr) { |
||||
let currentDeleteArr = selfConfig.filter(i => { |
||||
if (i.isRow) { |
||||
return i.groupId === node.id; |
||||
} else { |
||||
return i.groupPid === node.id; |
||||
} |
||||
}); |
||||
if (currentDeleteArr.length) { |
||||
currentDeleteArr.forEach(i => { |
||||
deleteArr.push(i); |
||||
this.deleteLoop(selfConfig, i, deleteArr); |
||||
}); |
||||
} else { |
||||
return; |
||||
} |
||||
}, |
||||
//判断是否是row |
||||
judgeNodeIsRow(node) { |
||||
return node.isRow; |
||||
}, |
||||
//删除后重组数组 |
||||
repickDeleteArr(repickConfig) { |
||||
let selfConfig = JSON.parse(JSON.stringify(this.selfConfig)); |
||||
selfConfig.forEach(i => { |
||||
if (i.isRow && i.groupId === repickConfig.id) { |
||||
i.groupId = repickConfig.groupId; |
||||
} else if (i.groupPid === repickConfig.id) { |
||||
i.groupPid = repickConfig.groupId; |
||||
} |
||||
}); |
||||
return selfConfig; |
||||
}, |
||||
//绘制body |
||||
drawBody(h, node) { |
||||
if (node.childNode) { |
||||
return FlowFactory.getFactory.bind(this, h, node.childNode)(); |
||||
} else { |
||||
return <div></div>; |
||||
} |
||||
}, |
||||
|
||||
}, |
||||
destroyed() { |
||||
// EventBus.$off("nodeChange"); |
||||
}, |
||||
render(h) { |
||||
// this.init(); |
||||
let FlowConfig = this.selfConfig; |
||||
FlowConfig = this.transformTree(FlowConfig); |
||||
const root = JSON.parse(JSON.stringify(this.selfConfig[0])); |
||||
return ( |
||||
<div class="design-engine"> |
||||
<div class="dingflow-design"> |
||||
<div class="ie-polyfill-container"> |
||||
<div class="box-scale" id="box-scale"> |
||||
{RowFactory.nodeWrapRender.bind(this, h, root)()} |
||||
{this.drawBody(h, FlowConfig[0])} |
||||
<div class="end-node"> |
||||
<div class="end-node-circle"></div> |
||||
<div class="end-node-text">流程结束</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
}, |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.design-engine { |
||||
position: relative; |
||||
height: 100%; |
||||
.dingflow-design { |
||||
width: 100%; |
||||
// background-color: #f5f5f7; |
||||
overflow: auto; |
||||
height: 100%; |
||||
position: relative; |
||||
bottom: 0; |
||||
left: 0; |
||||
right: 0; |
||||
top: 0; |
||||
/deep/ .ant-popover-arrow { |
||||
display: none !important; |
||||
} |
||||
.ie-polyfill-container { |
||||
display: -ms-grid; |
||||
-ms-grid-columns: min-content; |
||||
.box-scale { |
||||
transform: scale(1); |
||||
display: inline-block; |
||||
position: relative; |
||||
width: 100%; |
||||
padding: 54.5px 0; |
||||
-webkit-box-align: start; |
||||
-ms-flex-align: start; |
||||
align-items: flex-start; |
||||
-webkit-box-pack: center; |
||||
-ms-flex-pack: center; |
||||
justify-content: center; |
||||
-ms-flex-wrap: wrap; |
||||
flex-wrap: wrap; |
||||
min-width: -webkit-min-content; |
||||
min-width: -moz-min-content; |
||||
min-width: min-content; |
||||
// background-color: #f5f5f7; |
||||
-webkit-transform-origin: 0 0 0; |
||||
transform-origin: 50% 0px 0px; |
||||
.end-node { |
||||
border-radius: 50%; |
||||
font-size: 14px; |
||||
color: rgba(25, 31, 37, 0.4); |
||||
text-align: left; |
||||
.end-node-circle { |
||||
width: 10px; |
||||
height: 10px; |
||||
margin: auto; |
||||
border-radius: 50%; |
||||
background: #dbdcdc; |
||||
} |
||||
.end-node-text { |
||||
margin-top: 5px; |
||||
text-align: center; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,127 @@ |
||||
<!-- |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec 多列生成流程中 添加节点的图标 |
||||
--> |
||||
<script> |
||||
import AddBox from "@/components/DrawFlow/src/components/DrawAddSelectBox/DrawAddBox.vue"; |
||||
export default { |
||||
name: "AddNodeBtn", |
||||
components: { |
||||
AddBox |
||||
}, |
||||
props: { |
||||
belongToNode: { |
||||
type: Object, |
||||
default() { |
||||
return {}; |
||||
} |
||||
} |
||||
}, |
||||
data() { |
||||
return { |
||||
popoVisible: false |
||||
}; |
||||
}, |
||||
methods: { |
||||
getPopupContainer() { |
||||
let el = document.getElementsByClassName("dingflow-design")[0]; |
||||
return el; |
||||
}, |
||||
clickSelectBox(nextNode) { |
||||
this.popoVisible = false; |
||||
this.$emit("clickSelectBox", nextNode); |
||||
} |
||||
}, |
||||
mounted() {}, |
||||
render() { |
||||
const node = this.belongToNode; |
||||
return ( |
||||
<div class="add-node-btn-box"> |
||||
<div class="add-node-btn"> |
||||
<a-popover |
||||
auto-adjust-overflow |
||||
arrow-point-at-center |
||||
placement="rightTop" |
||||
v-model={this.popoVisible} |
||||
trigger="click" |
||||
> |
||||
<template slot="content"> |
||||
<add-box |
||||
{...{ |
||||
props: { nodeConfig: node }, |
||||
on: { |
||||
clickSelectBox: this.clickSelectBox |
||||
} |
||||
}} |
||||
></add-box> |
||||
</template> |
||||
<button class="btn" type="button"> |
||||
<a-icon type="plus" class="iconfont" ></a-icon> |
||||
</button> |
||||
</a-popover> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.add-node-btn-box { |
||||
width: 240px; |
||||
display: -webkit-inline-box; |
||||
display: -ms-inline-flexbox; |
||||
display: inline-flex; |
||||
-ms-flex-negative: 0; |
||||
flex-shrink: 0; |
||||
-webkit-box-flex: 1; |
||||
-ms-flex-positive: 1; |
||||
position: relative; |
||||
&::before { |
||||
content: ""; |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
right: 0; |
||||
bottom: 0; |
||||
z-index: 0; |
||||
margin: auto; |
||||
width: 2px; |
||||
height: 100%; |
||||
background-color: #cacaca; |
||||
} |
||||
.add-node-btn { |
||||
user-select: none; |
||||
width: 240px; |
||||
padding: 28px 0px 38px; |
||||
display: flex; |
||||
-webkit-box-pack: center; |
||||
justify-content: center; |
||||
flex-shrink: 0; |
||||
-webkit-box-flex: 1; |
||||
flex-grow: 1; |
||||
.btn { |
||||
outline: none; |
||||
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.1); |
||||
width: 30px; |
||||
height: 30px; |
||||
background: #3296fa; |
||||
border-radius: 50%; |
||||
position: relative; |
||||
border: none; |
||||
line-height: 30px; |
||||
-webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
||||
transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
||||
&:hover { |
||||
transform: scale(1.3); |
||||
box-shadow: 0 13px 27px 0 rgba(0, 0, 0, 0.1); |
||||
} |
||||
.iconfont { |
||||
color: #fff; |
||||
font-size: 16px; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,96 @@ |
||||
<!-- |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec 添加新增节点按钮 |
||||
--> |
||||
<script> |
||||
/* eslint-disable no-unused-vars */ |
||||
import "./addBox.scss"; |
||||
import { NextNode } from "@/components/DrawFlow/src/components/DrawAddSelectBox/NextNode"; |
||||
import { HashCode } from "../../utils"; |
||||
export default { |
||||
name: "AddBox", |
||||
props: { |
||||
nodeConfig: { |
||||
type: Object, |
||||
default() { |
||||
return {}; |
||||
}, |
||||
}, |
||||
}, |
||||
data() { |
||||
return { |
||||
boxArr: [ |
||||
{ |
||||
type: "2", |
||||
value: "审批人", |
||||
isRow: true, |
||||
calssName: "approver", |
||||
icon: "user" |
||||
}, |
||||
{ |
||||
type: "4", |
||||
value: "抄送人", |
||||
isRow: true, |
||||
calssName: "notifier", |
||||
icon: "highlight" |
||||
}, |
||||
{ |
||||
type: "3", |
||||
value: "条件分支", |
||||
isRow: false, |
||||
calssName: "route", |
||||
icon: "sliders" |
||||
}, |
||||
{ |
||||
type: "6", |
||||
value: "流转至", |
||||
isRow: false, |
||||
calssName: "route", |
||||
icon: "sliders" |
||||
}, |
||||
], |
||||
}; |
||||
}, |
||||
methods: { |
||||
clickSelectBox(item) { |
||||
this.getNexttBox(item); |
||||
}, |
||||
getNexttBox(item) { |
||||
const nodeConfig = this.nodeConfig; |
||||
if (item.value === "流转至") { |
||||
this.nodeConfig.isFlowTo = true; |
||||
} |
||||
let { id, prevId, type, isRow } = Object.assign(nodeConfig, item); |
||||
let nextNode = new NextNode({ id, prevId, type, isRow }); |
||||
this.$emit("clickSelectBox", nextNode); |
||||
}, |
||||
renderAddSBox() { |
||||
return ( |
||||
<div class="add-node-popover"> |
||||
<div class="add-node-popover-body"> |
||||
{this.boxArr.map((item) => { |
||||
return ( |
||||
<a |
||||
onClick={() => { |
||||
this.clickSelectBox(item); |
||||
}} |
||||
class={["add-node-popover-item", item.calssName]} |
||||
> |
||||
<div class="item-wrapper"> |
||||
<a-icon class="iconfont" type={item.icon} /> |
||||
</div> |
||||
<span>{item.value}</span> |
||||
</a> |
||||
); |
||||
})} |
||||
</div> |
||||
</div> |
||||
); |
||||
}, |
||||
}, |
||||
render() { |
||||
return this.renderAddSBox(); |
||||
}, |
||||
}; |
||||
</script> |
@ -0,0 +1,15 @@ |
||||
/** |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec 下一节点属性 |
||||
*/ |
||||
|
||||
// 构造函数,创建一个对象
|
||||
export class NextNode { |
||||
constructor({ id, prevId, type, isRow }) { |
||||
this.id = id; |
||||
this.prevId = prevId; |
||||
this.type = type; |
||||
this.isRow = isRow; |
||||
} |
||||
} |
@ -0,0 +1,53 @@ |
||||
.add-node-popover-body { |
||||
max-width: 336px; |
||||
.add-node-popover-item { |
||||
display: inline-flex; |
||||
align-items: center; |
||||
cursor: pointer; |
||||
color: #191F25 !important; |
||||
margin-right: 8px; |
||||
margin-bottom: 8px; |
||||
width: 160px; |
||||
background: rgba(17, 31, 44, 0.02); |
||||
padding: 8px; |
||||
border: 1px solid #FFFFFF; |
||||
border-radius: 4px; |
||||
.iconfont { |
||||
font-size: 20px; |
||||
line-height: 40px; |
||||
} |
||||
.item-wrapper { |
||||
user-select: none; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
width: 40px; |
||||
height: 40px; |
||||
background: #FFFFFF; |
||||
border: 1px solid #eeeeee; |
||||
border-radius: 16px; |
||||
transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
||||
margin-right: 12px; |
||||
} |
||||
&:hover{ |
||||
background: #FFFFFF; |
||||
border: 1px solid #ecedef; |
||||
box-shadow: 0 2px 8px 0 rgba(17, 31, 44, 0.08); |
||||
} |
||||
} |
||||
.add-node-popover-item.approver { |
||||
.item-wrapper { |
||||
color: #FF943E; |
||||
} |
||||
} |
||||
.add-node-popover-item.notifier { |
||||
.item-wrapper { |
||||
color: #3296FA; |
||||
} |
||||
} |
||||
.add-node-popover-item.route { |
||||
.item-wrapper { |
||||
color: #15BC83; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,126 @@ |
||||
/** |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec col节点工厂 |
||||
*/ |
||||
import drawFlow from "../factory"; |
||||
|
||||
import "./layout.scss"; |
||||
function branchBoxRender(h, nodeArr) { |
||||
// let title = [];
|
||||
// if (nodeArr.isFlowTo) {
|
||||
// title = "添加流转";
|
||||
// } else {
|
||||
// title = "添加条件";
|
||||
// }
|
||||
const colNodeArr = nodeArr.conditionNodes; |
||||
return ( |
||||
<div class="branch-wrap"> |
||||
<div class="branch-box-wrap"> |
||||
<div class="branch-box"> |
||||
{/* <button onClick={() => this.addBranch(colNodeArr)} class="add-branch"> |
||||
{title} |
||||
</button> */} |
||||
{colBoxRender.bind(this, h, colNodeArr)()} |
||||
</div> |
||||
<add-node-btn |
||||
{...{ |
||||
props: { belongToNode: nodeArr }, |
||||
on: { clickSelectBox: this.clickSelectBox } |
||||
}} |
||||
></add-node-btn> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
||||
/** |
||||
* col-box |
||||
*/ |
||||
function colBoxRender(h, colNodeArr) { |
||||
return colNodeArr.map((item, idx) => { |
||||
switch (idx) { |
||||
case 0: |
||||
return ( |
||||
<div class="col-box"> |
||||
<div class="top-left-cover-line"></div> |
||||
<div class="bottom-left-cover-line"></div> |
||||
{conditionNodeRender.bind(this, h, item)()} |
||||
</div> |
||||
); |
||||
case colNodeArr.length - 1: |
||||
return ( |
||||
<div class="col-box"> |
||||
{conditionNodeRender.bind(this, h, item)()} |
||||
<div class="top-right-cover-line"></div> |
||||
<div class="bottom-right-cover-line"></div> |
||||
</div> |
||||
); |
||||
default: |
||||
return ( |
||||
<div class="col-box">{conditionNodeRender.bind(this, h, item)()}</div> |
||||
); |
||||
} |
||||
}); |
||||
} |
||||
function closeNode(event, node) { |
||||
event.stopPropagation(); |
||||
this.closeNode(node); |
||||
} |
||||
function conditionNodeRender(h, node) { |
||||
const judegeNode = { ...node }; |
||||
let tep = []; |
||||
tep.push( |
||||
<div class="condition-node"> |
||||
<div class="condition-node-box"> |
||||
<div |
||||
class="auto-judge node_e27d_5719" |
||||
onClick={() => { |
||||
this.clickNode(node); |
||||
}} |
||||
> |
||||
<div class="sort-left"></div> |
||||
<div class="title-wrapper"> |
||||
<span class="editable-title">{judegeNode.title}</span> |
||||
{/* <i |
||||
aria-label="icon: close" |
||||
tabindex="-1" |
||||
class="anticon anticon-close close" |
||||
> |
||||
<a-icon |
||||
type="close" |
||||
onClick={event => { |
||||
closeNode.bind(this, event, node)(); |
||||
}} |
||||
/> |
||||
</i> */} |
||||
{/* <span class="priority-title"> |
||||
{judegeNode.data.priority || "123"} |
||||
</span> */} |
||||
</div> |
||||
{/* <div class="content">{judegeNode.content}</div> */} |
||||
<div class="content flex-between"> |
||||
<div class="text">{judegeNode.content}</div> |
||||
<i class="el-icon-arrow-right"></i> |
||||
</div> |
||||
</div> |
||||
<add-node-btn |
||||
{...{ |
||||
props: { belongToNode: judegeNode }, |
||||
on: { clickSelectBox: this.clickSelectBox } |
||||
}} |
||||
></add-node-btn> |
||||
</div> |
||||
</div> |
||||
); |
||||
|
||||
if (node.childNode) { |
||||
let el = drawFlow.getFactory.bind(this, h, node.childNode)(); |
||||
tep.push(el); |
||||
} |
||||
// let el = drawFlow.getFactory.bind(this, h, node)();
|
||||
// tep.push(el);
|
||||
return tep; |
||||
} |
||||
export default { |
||||
branchBoxRender |
||||
}; |
@ -0,0 +1,264 @@ |
||||
|
||||
.branch-wrap { |
||||
display: inline-flex; |
||||
width: 100%; |
||||
.branch-box-wrap { |
||||
display: flex; |
||||
-webkit-box-orient: vertical; |
||||
-webkit-box-direction: normal; |
||||
-ms-flex-direction: column; |
||||
flex-direction: column; |
||||
-ms-flex-wrap: wrap; |
||||
flex-wrap: wrap; |
||||
-webkit-box-align: center; |
||||
-ms-flex-align: center; |
||||
align-items: center; |
||||
min-height: 270px; |
||||
width: 100%; |
||||
-ms-flex-negative: 0; |
||||
flex-shrink: 0; |
||||
.branch-box { |
||||
display: flex; |
||||
overflow: visible; |
||||
min-height: 180px; |
||||
height: auto; |
||||
border-bottom: 2px solid #cccccc; |
||||
border-top: 2px solid #cccccc; |
||||
position: relative; |
||||
// margin-top: 15px; |
||||
.add-branch { |
||||
border: none; |
||||
outline: none; |
||||
user-select: none; |
||||
justify-content: center; |
||||
font-size: 12px; |
||||
padding: 0 10px; |
||||
height: 30px; |
||||
line-height: 30px; |
||||
border-radius: 15px; |
||||
color: #0089ff; |
||||
background: #fff; |
||||
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.1); |
||||
position: absolute; |
||||
top: -16px; |
||||
left: 50%; |
||||
transform: translateX(-50%); |
||||
transform-origin: center center; |
||||
cursor: pointer; |
||||
z-index: 1; |
||||
display: inline-flex; |
||||
align-items: center; |
||||
-webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
||||
transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
||||
} |
||||
.col-box { |
||||
// background: #f0f2f5; |
||||
display: inline-flex; |
||||
-webkit-box-orient: vertical; |
||||
-webkit-box-direction: normal; |
||||
flex-direction: column; |
||||
-webkit-box-align: center; |
||||
align-items: center; |
||||
position: relative; |
||||
&::before { |
||||
content: ""; |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
right: 0; |
||||
bottom: 0; |
||||
z-index: 0; |
||||
margin: auto; |
||||
width: 2px; |
||||
height: 100%; |
||||
background-color: #cacaca; |
||||
} |
||||
|
||||
.top-left-cover-line { |
||||
position: absolute; |
||||
height: 3px; |
||||
width: 50%; |
||||
background-color: #f5f5f7; |
||||
top: -2px; |
||||
left: -1px; |
||||
} |
||||
.bottom-left-cover-line { |
||||
position: absolute; |
||||
height: 3px; |
||||
width: 50%; |
||||
background-color: #f5f5f7; |
||||
bottom: -2px; |
||||
left: -1px; |
||||
} |
||||
.top-right-cover-line { |
||||
position: absolute; |
||||
height: 3px; |
||||
width: 50%; |
||||
background-color: #f5f5f7; |
||||
top: -2px; |
||||
right: -1px; |
||||
} |
||||
.bottom-right-cover-line { |
||||
position: absolute; |
||||
height: 3px; |
||||
width: 50%; |
||||
background-color: #f5f5f7; |
||||
bottom: -2px; |
||||
right: -1px; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
.dingflow-design .auto-judge .sort-left, |
||||
.dingflow-design .auto-judge .sort-right { |
||||
position: absolute; |
||||
top: 0; |
||||
bottom: 0; |
||||
display: none; |
||||
z-index: 1; |
||||
} |
||||
.condition-node { |
||||
min-height: 220px; |
||||
display: inline-flex; |
||||
-webkit-box-orient: vertical; |
||||
-webkit-box-direction: normal; |
||||
flex-direction: column; |
||||
-webkit-box-flex: 1; |
||||
.condition-node-box { |
||||
padding-top: 30px; |
||||
padding-right: 50px; |
||||
padding-left: 50px; |
||||
-webkit-box-pack: center; |
||||
justify-content: center; |
||||
display: inline-flex; |
||||
-webkit-box-align: center; |
||||
align-items: center; |
||||
-webkit-box-orient: vertical; |
||||
-webkit-box-direction: normal; |
||||
flex-direction: column; |
||||
-webkit-box-flex: 1; |
||||
flex-grow: 1; |
||||
position: relative; |
||||
&::before { |
||||
content: ""; |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
right: 0; |
||||
bottom: 0; |
||||
margin: auto; |
||||
width: 2px; |
||||
height: 100%; |
||||
background-color: #cacaca; |
||||
} |
||||
.auto-judge { |
||||
position: relative; |
||||
width: 220px; |
||||
min-height: 72px; |
||||
background: #ffffff; |
||||
// padding: 14px 19px; |
||||
cursor: pointer; |
||||
.close { |
||||
width: 14px; |
||||
height: 14px; |
||||
display: none; |
||||
position: absolute; |
||||
right: -2px; |
||||
top: -2px; |
||||
font-size: 14px; |
||||
text-align: center; |
||||
line-height: 20px; |
||||
z-index: 2; |
||||
color: rgba(25, 31, 37, 0.56); |
||||
} |
||||
.priority-title { |
||||
display: block; |
||||
margin-right: 10px; |
||||
float: right; |
||||
color: rgba(25, 31, 37, 0.56); |
||||
} |
||||
&:hover { |
||||
.close{ |
||||
display: block; |
||||
} |
||||
.priority-title{ |
||||
display: none; |
||||
} |
||||
&::after { |
||||
border: 1px solid #3296fa; |
||||
box-shadow: 0 0 6px 0 rgba(50, 150, 250, 0.3); |
||||
} |
||||
} |
||||
&::after{ |
||||
pointer-events: none; |
||||
content: ''; |
||||
position: absolute; |
||||
top: 0; |
||||
bottom: 0; |
||||
left: 0; |
||||
right: 0; |
||||
z-index: 2; |
||||
border-radius: 4px; |
||||
border: 1px solid transparent; |
||||
transition: all 0.1s cubic-bezier(0.645, 0.045, 0.355, 1); |
||||
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.1); |
||||
} |
||||
.title-wrapper { |
||||
position: relative; |
||||
background: #ff943e; |
||||
padding-left: 16px; |
||||
padding-right: 30px; |
||||
width: 100%; |
||||
height: 30px; |
||||
line-height: 30px; |
||||
font-size: 14px; |
||||
color: #ffffff; |
||||
text-align: left; |
||||
border-radius: 4px 4px 0px 0px; |
||||
text-align: left; |
||||
.editable-title { |
||||
line-height: 15px; |
||||
overflow: hidden; |
||||
border-bottom: dashed 1px transparent; |
||||
display: inline-block; |
||||
max-width: 120px; |
||||
white-space: nowrap; |
||||
text-overflow: ellipsis; |
||||
// &:hover { |
||||
// border-bottom: dashed 1px #ffffff; |
||||
// } |
||||
&::before { |
||||
content: ""; |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
bottom: 0; |
||||
right: 40px; |
||||
} |
||||
} |
||||
|
||||
} |
||||
.content { |
||||
// padding: 16px; |
||||
height: 50px; |
||||
line-height: 50px; |
||||
padding: 0 30px 0 16px; |
||||
font-size: 14px; |
||||
color: #191f25; |
||||
text-align: left; |
||||
// margin-top: 6px; |
||||
// overflow: hidden; |
||||
// text-overflow: ellipsis; |
||||
// // display: -webkit-box; |
||||
// -webkit-line-clamp: 3; |
||||
// -webkit-box-orient: vertical; |
||||
} |
||||
.sort-right { |
||||
right: 0; |
||||
border-left: 1px solid #f6f6f6; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,46 @@ |
||||
/** |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec row节点包裹框 |
||||
*/ |
||||
import "./row.scss"; |
||||
import drawFlow from "../factory"; |
||||
export default { |
||||
/** |
||||
* |
||||
* @param {creatElement} h |
||||
* @param {Object} nodeConfig |
||||
*/ |
||||
nodeWrapRender(h, nodeConfig) { |
||||
let tep = []; |
||||
tep.push( |
||||
<div class="node-wrap"> |
||||
<flow-node |
||||
{...{ |
||||
props: { nodeConfig }, |
||||
on: { |
||||
clickNode: this.clickNode, |
||||
closeNode: this.closeNode |
||||
} |
||||
}} |
||||
></flow-node> |
||||
<add-node-btn |
||||
{...{ |
||||
props: { belongToNode: nodeConfig }, |
||||
on: { |
||||
clickSelectBox: this.clickSelectBox |
||||
} |
||||
}} |
||||
></add-node-btn> |
||||
</div> |
||||
); |
||||
if (nodeConfig.isRoot) { |
||||
return tep; |
||||
} |
||||
if (nodeConfig.childNode) { |
||||
let el = drawFlow.getFactory.bind(this, h, nodeConfig.childNode)(); |
||||
tep.push(el); |
||||
} |
||||
return tep; |
||||
} |
||||
}; |
@ -0,0 +1,198 @@ |
||||
<!-- |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec 单列生成流程节点的基本节点(开始,抄送,审批) |
||||
--> |
||||
<script> |
||||
export default { |
||||
name: "FlowNode", |
||||
props: { |
||||
nodeConfig: { |
||||
type: Object, |
||||
default() { |
||||
return { |
||||
pid: "root", |
||||
id: "1", |
||||
type: "root", // 1:发起人 2:审批人 3 抄送人 4条件框 |
||||
title: "所有人12", |
||||
content: "内容2", |
||||
isRow: true, |
||||
data: {} |
||||
}; |
||||
} |
||||
} |
||||
}, |
||||
data() { |
||||
return {}; |
||||
}, |
||||
methods: { |
||||
clickNode(nodeConfig) { |
||||
this.$emit("clickNode", nodeConfig); |
||||
}, |
||||
closeNode(e, nodeConfig) { |
||||
e.stopPropagation(); |
||||
this.$emit("closeNode", nodeConfig); |
||||
} |
||||
}, |
||||
|
||||
render() { |
||||
const { title, content, type } = this.nodeConfig; |
||||
// ---------span 下面, x号点击取消节点 |
||||
// <i |
||||
// aria-label="icon: close" |
||||
// tabindex="-1" |
||||
// class="anticon anticon-close close" |
||||
// > |
||||
// <a-icon |
||||
// type="close" |
||||
// onClick={event => { |
||||
// this.closeNode(event, this.nodeConfig); |
||||
// }} |
||||
// /> |
||||
// </i> |
||||
|
||||
return ( |
||||
<div |
||||
onClick={() => { |
||||
this.clickNode(this.nodeConfig); |
||||
}} |
||||
class="node-wrap-box node_sid-startevent start-node" |
||||
> |
||||
<div> |
||||
<div class={[type !== "1" ? "arrows" : "noArrows"]}> |
||||
<div class={[`node-type-${type}`, "title"]}> |
||||
<span class="edit-title">{title}</span> |
||||
</div> |
||||
</div> |
||||
<div class="content flex-between"> |
||||
<div class="text">{content}</div> |
||||
<i class="el-icon-arrow-right"></i> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.arrows { |
||||
&::before { |
||||
content: ""; |
||||
position: absolute; |
||||
top: -12px; |
||||
left: 50%; |
||||
-webkit-transform: translateX(-50%); |
||||
transform: translateX(-50%); |
||||
width: 0; |
||||
height: 8px; |
||||
border-style: solid; |
||||
border-width: 8px 6px 4px; |
||||
border-color: #cacaca transparent transparent; |
||||
background: #f5f5f7; |
||||
} |
||||
} |
||||
.node-wrap-box { |
||||
display: -webkit-inline-box; |
||||
display: -ms-inline-flexbox; |
||||
display: inline-flex; |
||||
-webkit-box-orient: vertical; |
||||
-webkit-box-direction: normal; |
||||
-ms-flex-direction: column; |
||||
flex-direction: column; |
||||
position: relative; |
||||
width: 220px; |
||||
min-height: 72px; |
||||
-ms-flex-negative: 0; |
||||
flex-shrink: 0; |
||||
background: #ffffff; |
||||
border-radius: 4px; |
||||
cursor: pointer; |
||||
.close { |
||||
display: none; |
||||
position: absolute; |
||||
right: 10px; |
||||
top: 50%; |
||||
transform: translateY(-50%); |
||||
width: 20px; |
||||
height: 20px; |
||||
font-size: 14px; |
||||
color: #fff; |
||||
border-radius: 50%; |
||||
text-align: center; |
||||
line-height: 20px; |
||||
} |
||||
&:hover { |
||||
.close { |
||||
display: block; |
||||
} |
||||
&::after { |
||||
border: 1px solid #3296fa; |
||||
box-shadow: 0 0 6px 0 rgba(50, 150, 250, 0.3); |
||||
} |
||||
} |
||||
&::after { |
||||
pointer-events: none; |
||||
content: ""; |
||||
position: absolute; |
||||
top: 0; |
||||
bottom: 0; |
||||
left: 0; |
||||
right: 0; |
||||
z-index: 2; |
||||
border-radius: 4px; |
||||
border: 1px solid transparent; |
||||
transition: all 0.1s cubic-bezier(0.645, 0.045, 0.355, 1); |
||||
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.1); |
||||
} |
||||
//审批 |
||||
.node-type-1 { |
||||
background: rgb(87, 106, 149); |
||||
} |
||||
.node-type-2 { |
||||
background: rgb(255, 148, 62); |
||||
} |
||||
.node-type-4 { |
||||
background: rgb(50, 150, 250); |
||||
} |
||||
.title { |
||||
position: relative; |
||||
display: flex; |
||||
align-items: center; |
||||
padding-left: 16px; |
||||
padding-right: 30px; |
||||
width: 100%; |
||||
height: 30px; |
||||
line-height: 30px; |
||||
font-size: 14px; |
||||
color: #ffffff; |
||||
text-align: left; |
||||
border-radius: 4px 4px 0px 0px; |
||||
.edit-title { |
||||
line-height: 24px; |
||||
overflow: hidden; |
||||
white-space: nowrap; |
||||
text-overflow: ellipsis; |
||||
border-bottom: dashed 1px transparent; |
||||
&::before { |
||||
content: ""; |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
bottom: 0; |
||||
right: 40px; |
||||
} |
||||
} |
||||
} |
||||
.content { |
||||
position: relative; |
||||
font-size: 14px; |
||||
padding: 16px; |
||||
padding-right: 30px; |
||||
.text { |
||||
display: block; |
||||
white-space: nowrap; |
||||
} |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,19 @@ |
||||
.node-wrap,.flow-wrap { |
||||
display: inline-flex; |
||||
flex-direction: column; |
||||
-webkit-box-pack: start; |
||||
-ms-flex-pack: start; |
||||
justify-content: flex-start; |
||||
-webkit-box-align: center; |
||||
-ms-flex-align: center; |
||||
align-items: center; |
||||
-ms-flex-wrap: wrap; |
||||
flex-wrap: wrap; |
||||
-webkit-box-flex: 1; |
||||
-ms-flex-positive: 1; |
||||
width: 100%; |
||||
padding: 0 50px; |
||||
position: relative; |
||||
} |
||||
|
||||
|
@ -0,0 +1,49 @@ |
||||
/* eslint-disable no-unused-vars */ |
||||
/** |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec 各种节点类 |
||||
*/ |
||||
import { HashCode } from "../../utils"; |
||||
export class Node { |
||||
nodeId; |
||||
type; |
||||
childNode; |
||||
title = "title"; |
||||
content = "content"; |
||||
conditionNodes; |
||||
constructor({ id, type, isRow }) { |
||||
this.groupId = id; |
||||
this.id = HashCode(); |
||||
this.type = type; |
||||
this.content += this.id; |
||||
this.isRow = isRow; |
||||
} |
||||
} |
||||
export class ConditionNode { |
||||
title = "title"; |
||||
data = {}; |
||||
constructor({ groupId, type, id, isRow }) { |
||||
this.id = HashCode(); |
||||
this.groupId = groupId; |
||||
this.type = type; |
||||
this.content += this.id; |
||||
this.groupPid = id; |
||||
this.isRow = isRow; |
||||
} |
||||
} |
||||
export class RowNode extends Node { |
||||
data = {}; |
||||
constructor({ id, type, isRow }) { |
||||
super({ id, type, isRow }); |
||||
} |
||||
} |
||||
export class CopyNode { |
||||
title = "标题"; |
||||
id = HashCode(); |
||||
content = "内容"; |
||||
data = {}; |
||||
constructor({ id, childNode, ...node }) { |
||||
return Object.assign(node, this); |
||||
} |
||||
} |
@ -0,0 +1,19 @@ |
||||
import RowFactory from "@/components/DrawFlow/src/components/DrawRow/FactoryRow"; |
||||
import ColFactory from "./DrawCol/FactoryCol"; |
||||
function getFactory(h, item) { |
||||
let tep = []; |
||||
if (item.type === "route") { |
||||
//多节点
|
||||
tep.push(ColFactory.branchBoxRender.bind(this, h, item)()); |
||||
if (item.childNode) { |
||||
tep.push(getFactory.bind(this, h, item.childNode)()); |
||||
} |
||||
} |
||||
if (item.type !== "route") { |
||||
tep.push(RowFactory.nodeWrapRender.bind(this, h, item)()); |
||||
} |
||||
return tep; |
||||
} |
||||
export default { |
||||
getFactory |
||||
}; |
@ -0,0 +1,30 @@ |
||||
<!-- |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec 预留接口 主要用在添加新功能 应用场景 多流程 |
||||
--> |
||||
<script> |
||||
import { transToTreeDat } from "../utils"; |
||||
|
||||
export default { |
||||
name: "FlowFactoryMixin", |
||||
props: {}, |
||||
methods: { |
||||
/** |
||||
* @param data 源数组一维数组 |
||||
* @requires tree 二维数组 |
||||
*/ |
||||
transformTree(data) { |
||||
return transToTreeDat(data); |
||||
} |
||||
}, |
||||
watch: {} |
||||
}; |
||||
</script> |
||||
|
||||
<style> |
||||
.branch-wrap { |
||||
display: inline-flex; |
||||
width: 100%; |
||||
} |
||||
</style> |
@ -0,0 +1,230 @@ |
||||
/** |
||||
* @author 肖阳 |
||||
* @time 2020-9-10 |
||||
* @dec 公共方法 |
||||
*/ |
||||
// https://github.com/reduxjs/redux/blob/master/src/compose.js
|
||||
import moment from "moment"; |
||||
|
||||
export function compose(...funcs) { |
||||
if (funcs.length === 0) { |
||||
return arg => arg; |
||||
} |
||||
if (funcs.length === 1) { |
||||
return funcs[0]; |
||||
} |
||||
return funcs.reduce((a, b) => (...args) => a(b(...args))); |
||||
} |
||||
|
||||
/** |
||||
* 转化为el-tree树形结构数据 |
||||
*/ |
||||
export function transToTreeDat(arr) { |
||||
let list = JSON.parse(JSON.stringify(arr)); |
||||
let colNodes = list.filter(i => !i.isRow); |
||||
let colNodesGroup = getColNode(colNodes); |
||||
let allNodes = list.concat(colNodesGroup); |
||||
let tree = transTree(allNodes); |
||||
return tree; |
||||
} |
||||
export function getColNode(colNodeArrs) { |
||||
let colNodes = colNodeArrs; |
||||
let map = {}; |
||||
colNodes.forEach(i => { |
||||
if (!map[i.groupId]) { |
||||
map[i.groupId] = []; |
||||
} |
||||
map[i.groupId].push(i); |
||||
}); |
||||
let colNodesArr = []; |
||||
for (const groupId in map) { |
||||
let obj = { |
||||
id: groupId, |
||||
groupId: map[groupId][0].groupPid, |
||||
type: "route", |
||||
isRow: true, |
||||
isFlowTo: map[groupId][0].type === "6", |
||||
conditionNodes: map[groupId] |
||||
}; |
||||
colNodesArr.push(obj); |
||||
} |
||||
|
||||
return colNodesArr; |
||||
} |
||||
/** |
||||
* |
||||
* @param {allNodes} arr 所有的整行元素 |
||||
* @param {*} list 所有的节点元素 |
||||
*/ |
||||
export function getPidArr(list) { |
||||
let colNodes = list.filter(i => !i.isRow); |
||||
let rowNodes = list.filter(i => i.isRow); |
||||
let colNodesGroup = getColNode(colNodes, list); |
||||
let arr = colNodesGroup.concat(rowNodes); |
||||
let map = {}; //所有整行元素的字典对象
|
||||
for (let item of arr) { |
||||
map[item.id] = item; |
||||
} |
||||
//获取节点所在行
|
||||
for (let lis of list) { |
||||
lis.pids = []; |
||||
if (!lis.isRow) { |
||||
let p = map[lis.groupPid]; |
||||
if (lis.groupPid === "root") { |
||||
lis.pids.push(p.id); |
||||
continue; |
||||
} |
||||
//当上一层为rowNode
|
||||
getColPid(p, lis); |
||||
} else { |
||||
let p = map[lis.groupId]; |
||||
getRowPid(p, lis); |
||||
} |
||||
} |
||||
} |
||||
//获取row的父节点id
|
||||
function getRowPid(p, lis) { |
||||
if (!p) { |
||||
lis.pids.push(lis.groupId); |
||||
} else { |
||||
if (p.conditionNodes) { |
||||
p.conditionNodes.forEach(i => { |
||||
loopGetPid(i, lis); |
||||
}); |
||||
} else { |
||||
lis.pids.push(p.id); |
||||
} |
||||
} |
||||
} |
||||
/** |
||||
* 获取col节点的父节点 |
||||
*/ |
||||
function getColPid(p, lis) { |
||||
if (!p) { |
||||
//当上一层为条件框元素
|
||||
lis.pids.push(lis.groupPid); |
||||
} else { |
||||
//当上一层为整行元素
|
||||
loopGetPidCol(p, lis); |
||||
} |
||||
} |
||||
/** |
||||
* |
||||
* @param {*} parentRow |
||||
* @param {*} lis |
||||
* 单独处理一下col节点 |
||||
*/ |
||||
export function loopGetPidCol(parentRow, lis) { |
||||
if (parentRow.conditionNodes) { |
||||
parentRow.conditionNodes.forEach(i => { |
||||
loopGetPid(i, lis); |
||||
}); |
||||
} else { |
||||
lis.pids.push(parentRow.id); |
||||
} |
||||
} |
||||
/** |
||||
* 轮询节点获取pid |
||||
* @param {*} node |
||||
* @param {*} lis |
||||
*/ |
||||
export function loopGetPid(node, lis) { |
||||
if (node.childNode) { |
||||
loopGetPid(node.childNode, lis); |
||||
} else if (node.conditionNodes) { |
||||
node.conditionNodes.forEach(i => { |
||||
loopGetPid(i, lis); |
||||
}); |
||||
} else { |
||||
lis.pids.push(node.id); |
||||
} |
||||
} |
||||
/** |
||||
* 转化为el-tree树形结构数据 |
||||
*/ |
||||
export function transTree(arr) { |
||||
let list = arr; |
||||
if (!list || !list.length) return []; |
||||
let map = {}; |
||||
for (let item of list) { |
||||
map[item.id] = item; |
||||
} |
||||
let nodes = []; |
||||
for (let lis of list) { |
||||
if (!lis.isRow) { |
||||
continue; |
||||
} |
||||
let p = map[lis.groupId]; |
||||
if (!p) { |
||||
nodes.push(lis); |
||||
continue; |
||||
} |
||||
p.isParent = true; |
||||
p.childNode || (p.childNode = {}); |
||||
p.childNode = lis; |
||||
if ( |
||||
p.childNode.conditionNodes && |
||||
p.childNode.conditionNodes[0].type === "6" |
||||
) { |
||||
p.isFlowTo = true; |
||||
} |
||||
} |
||||
return nodes; |
||||
} |
||||
/** |
||||
* Hash 哈希值 |
||||
*/ |
||||
export function HashCode(hashLength) { |
||||
// 默认长度 24
|
||||
return ( |
||||
"a" + |
||||
Array.from(Array(Number(hashLength) || 15), () => |
||||
Math.floor(Math.random() * 36).toString(36) |
||||
).join("") |
||||
); |
||||
} |
||||
/** |
||||
* 树结构转化为扁平化结构 |
||||
*/ |
||||
export function deepTraversal(tree) { |
||||
let list = []; |
||||
tree.forEach(item => { |
||||
const loop = data => { |
||||
list.push(data); |
||||
let children = data.children; |
||||
children && |
||||
children.length && |
||||
children.forEach(child => { |
||||
loop(child); |
||||
}); |
||||
}; |
||||
loop(item); |
||||
}); |
||||
return list; |
||||
} |
||||
/** |
||||
* 数据深拷 |
||||
* @param {Array|Object} 要拷贝的对象 |
||||
* @return {Array|Object} 返回拷贝的新对象 |
||||
*/ |
||||
export function deepClone(source) { |
||||
if (!source && typeof source !== "object") { |
||||
throw new Error("error arguments", "shallowClone"); |
||||
} |
||||
const targetObj = source.constructor === Array ? [] : {}; |
||||
for (const keys in source) { |
||||
if (Object.prototype.hasOwnProperty.call(source, keys)) { |
||||
if ( |
||||
source[keys] && |
||||
typeof source[keys] === "object" && |
||||
!moment.isMoment(source[keys]) |
||||
) { |
||||
targetObj[keys] = source[keys].constructor === Array ? [] : {}; |
||||
targetObj[keys] = deepClone(source[keys]); |
||||
} else { |
||||
targetObj[keys] = source[keys]; |
||||
} |
||||
} |
||||
} |
||||
return targetObj; |
||||
} |
@ -0,0 +1,102 @@ |
||||
<template> |
||||
<div> |
||||
<!-- 绑定手机号card --> |
||||
<div class="Login_view bindphone_view"> |
||||
<div class="flex-between login_title"> |
||||
<span>绑定手机号码</span> |
||||
<i class="el-icon-close" @click="toWechat"></i> |
||||
</div> |
||||
|
||||
<el-form :model="param" :rules="rules" ref="param" label-width="0px" class="login_form"> |
||||
<el-form-item prop="username"> |
||||
<p>手机号</p> |
||||
<el-input v-model="param.username" placeholder="请输入手机号"></el-input> |
||||
</el-form-item> |
||||
|
||||
<el-form-item prop="password" class="item_password"> |
||||
<p>验证码</p> |
||||
<div class="flex-between"> |
||||
<el-input type="password" placeholder="请输入验证码" v-model="param.password" @keyup.enter.native="nextStep()"></el-input> |
||||
<el-button type="primary" round @click="getCode" class="code-btn">获取验证码</el-button> |
||||
</div> |
||||
</el-form-item> |
||||
|
||||
<div class="login-btn flex-column-content"> |
||||
<el-button type="primary" round>绑定</el-button> |
||||
<el-button type="primary" plain round class="temporary" @click="toWechat">暂不绑定</el-button> |
||||
</div> |
||||
</el-form> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
data() { |
||||
return { |
||||
param: { |
||||
username: '', |
||||
password: '' |
||||
}, |
||||
rules: { |
||||
username: [{ required: true, message: '请输入手机号', trigger: 'blur' }], |
||||
password: [{ required: true, message: '请输入验证码', trigger: 'blur' }] |
||||
}, |
||||
checked: false |
||||
}; |
||||
}, |
||||
methods: { |
||||
getCode(){}, |
||||
toWechat(){ |
||||
this.$emit("toWechat", 1) |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
//提取Steps共同样式 |
||||
@mixin Steps_node { |
||||
width: 16px; |
||||
height: 16px; |
||||
border-radius: 50%; |
||||
} |
||||
.bindphone_view{ |
||||
.login_title{ |
||||
.Steps_view{ |
||||
margin-left: 146px; |
||||
.Steps1{ |
||||
height: 1px; |
||||
width: 28px; |
||||
background-color: #00B9FF; |
||||
} |
||||
.Steps1_node{ |
||||
@include Steps_node; |
||||
background-color: #00B9FF; |
||||
} |
||||
.Steps2{ |
||||
height: 1px; |
||||
width: 150px; |
||||
background-color: #ccc; |
||||
} |
||||
.Steps2_node{ |
||||
@include Steps_node; |
||||
background-color: #ccc; |
||||
} |
||||
} |
||||
i{ |
||||
margin-right: 50px; |
||||
color: #666; |
||||
font-size: 20px; |
||||
} |
||||
} |
||||
.code-btn{ |
||||
margin-left: 20px; |
||||
} |
||||
.temporary{ |
||||
margin-top: 20px; |
||||
} |
||||
} |
||||
</style> |
||||
|
||||
|
@ -0,0 +1,54 @@ |
||||
<template> |
||||
<div class="footer_view flex-column-content"> |
||||
<el-row justify="center" type="flex" :gutter="100" class="wd80 contact"> |
||||
<el-col :span="8"><span>© 2021 大庆市工商业融资担保有限公司 版权所有</span></el-col> |
||||
<el-col :span="8"><span>联系地址:黑龙江省大庆市</span></el-col> |
||||
<el-col :span="8"><span>联系邮箱:dqgsyrzdb@163.com</span></el-col> |
||||
</el-row> |
||||
<el-row :gutter="100" type="flex" class="wd80 contact" justify="center"> |
||||
<el-col :span="8"><span style="cursor:pointer" @click="open1">官方网站:http://www.dqdb.net</span></el-col> |
||||
<el-col :span="8"><span style="cursor:pointer" @click="open">许可证号:黑ICP备11006413号</span></el-col> |
||||
<el-col :span="8"><span>技术支持:深圳市斐凡科技有限公司</span></el-col> |
||||
</el-row> |
||||
<!-- <el-row :gutter="100" type="flex" class="wd80 contact" > |
||||
<el-col :span="8"><span>工信部链接:https://beian.miit.gov.cn</span></el-col> |
||||
</el-row> --> |
||||
<!-- <p class="wd60 record flex-between"> |
||||
<span>联系邮箱:dqgsyrzdb@163.com</span> |
||||
<span>公司名称:大庆市工商业融资担保有限公司</span> |
||||
<span>许可证号:黑ICP备11006413号</span> |
||||
</p> --> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
export default { |
||||
data(){ |
||||
return{ |
||||
|
||||
} |
||||
}, |
||||
methods:{ |
||||
open(){ |
||||
window.open('https://beian.miit.gov.cn') |
||||
}, |
||||
open1(){ |
||||
window.open('http://www.dqdb.net') |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.footer_view{ |
||||
background-color: #333; |
||||
padding: 30px 0 46px 0; |
||||
color: #999; |
||||
.solve{ |
||||
color: #fff; |
||||
width: 568px; |
||||
} |
||||
.contact{ |
||||
margin-top: 30px; |
||||
} |
||||
} |
||||
</style> |
||||
|
@ -0,0 +1,124 @@ |
||||
// 这个应该是废弃掉的 |
||||
<template> |
||||
|
||||
<div class="header flex-between"> |
||||
<!-- <div v-if="this.$route.path!='/dashboard'&&this.$route.path!='/teacherhome'&&this.$route.path!='/student'" |
||||
class="goBack" @click="back"><i class="el-icon-arrow-left"></i>返回</div> --> |
||||
<div class="logo"> |
||||
<img src="../../assets/img/logo.png"> |
||||
</div> |
||||
<div class="header-right"> |
||||
<div class="header-user-con"> |
||||
<!-- 用户头像 --> |
||||
<span>应用市场</span> |
||||
<el-divider class="ml20" direction="vertical"></el-divider> |
||||
<div class="ml20"> |
||||
<el-avatar :size="40" :src="this.$store.state.userPhoto"></el-avatar> |
||||
</div> |
||||
<span class="user-avator">{{username}}</span> |
||||
<el-divider class="ml20" direction="vertical"></el-divider> |
||||
<el-button type="text" class="ml20" @click="loginout">退出</el-button> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import bus from '../common/bus'; |
||||
export default { |
||||
data() { |
||||
return { |
||||
// name: 'huoran', |
||||
username: this.$store.state.name, |
||||
circleUrl: "https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png", |
||||
}; |
||||
}, |
||||
mounted(){ |
||||
}, |
||||
// computed: { |
||||
// username() { |
||||
// let username = sessionStorage.getItem('ms_username'); |
||||
// return username ? username : this.name; |
||||
// } |
||||
// }, |
||||
methods: { |
||||
loginout() { |
||||
sessionStorage.removeItem('ms_username'); |
||||
this.$router.push('/login'); |
||||
}, |
||||
toPersonalCenter(){ |
||||
this.$router.push('/personalcenter') |
||||
}, |
||||
back(){ |
||||
if(this.$route.path == '/addassessment'){ |
||||
this.$router.push({ path: '/teacherhome', query: { active: true }}) |
||||
}else{ |
||||
this.$router.go(-1) |
||||
} |
||||
} |
||||
}, |
||||
}; |
||||
</script> |
||||
<style scoped> |
||||
.goBack{ |
||||
cursor: pointer; |
||||
line-height: 60px; |
||||
height: 60px; |
||||
font-size: 16px; |
||||
font-weight: bold; |
||||
margin-left: 20px; |
||||
} |
||||
.goBack i{ |
||||
color: #9278ff; |
||||
font-size: 20px; |
||||
} |
||||
.header { |
||||
position: relative; |
||||
box-sizing: border-box; |
||||
width: 100%; |
||||
height: 60px; |
||||
font-size: 16px; |
||||
color: #333; |
||||
} |
||||
.header .logo { |
||||
float: left; |
||||
width: 170px; |
||||
height: 40px; |
||||
margin-left: 20px; |
||||
} |
||||
.header .logo img{ |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
.header-right { |
||||
float: right; |
||||
padding-right: 50px; |
||||
} |
||||
.header-user-con { |
||||
display: flex; |
||||
height: 70px; |
||||
align-items: center; |
||||
} |
||||
.user-avator { |
||||
cursor: pointer; |
||||
margin-left: 10px; |
||||
} |
||||
.ml20{ |
||||
margin-left: 20px; |
||||
} |
||||
.user-avator img { |
||||
display: block; |
||||
width: 40px; |
||||
height: 40px; |
||||
border-radius: 50%; |
||||
} |
||||
.header-right .el-button--text{ |
||||
color: #333; |
||||
} |
||||
.header-right .el-divider--vertical{ |
||||
width: 2px; |
||||
height: 15px; |
||||
} |
||||
.header-right .el-divider{ |
||||
background-color: #333; |
||||
} |
||||
</style> |
@ -0,0 +1,47 @@ |
||||
<template> |
||||
<div> |
||||
<div class="wrapper clearfix"> |
||||
<Sidebar></Sidebar> |
||||
<div class="content-box"> |
||||
<!-- <v-tags></v-tags> --> |
||||
<div class="content" :style="{ 'min-height':fullHeight + 'px' }"> |
||||
<transition name="move" mode="out-in"> |
||||
<keep-alive :include="tagsList"> |
||||
<router-view></router-view> |
||||
</keep-alive> |
||||
</transition> |
||||
<el-backtop target=".content"></el-backtop> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<Foot></Foot> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import bus from './bus'; |
||||
export default { |
||||
data() { |
||||
return { |
||||
tagsList: [], |
||||
collapse: false, |
||||
fullHeight: 0, |
||||
|
||||
}; |
||||
}, |
||||
created() { |
||||
let contentHeight = document.documentElement.clientHeight - 61 |
||||
this.fullHeight = contentHeight |
||||
// this.$store.commit("contentHeight", { contentHeight : contentHeight }); |
||||
|
||||
// 只有在标签页列表里的页面才使用keep-alive,即关闭标签之后就不保存到内存中了。 |
||||
bus.$on('tags', msg => { |
||||
let arr = []; |
||||
for (let i = 0, len = msg.length; i < len; i++) { |
||||
msg[i].name && arr.push(msg[i].name); |
||||
} |
||||
this.tagsList = arr; |
||||
}); |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,409 @@ |
||||
<template> |
||||
<div> |
||||
<div class=" shadow radius10 main"> |
||||
<div class="system_view mab20"> |
||||
<el-button type="primary" class="mgt20 mgr10" size="small" round icon="el-icon-plus" @click="addjurisdiction('add')">新增权限</el-button> |
||||
</div> |
||||
<Background-list :check="false" :nowPage="pageNo" :totalPage="totalPage" :tableData="jurisdiction" @getPaging='getPaging' :totalCount="totalCount" @getSize="getSize"> |
||||
<template v-slot:tableData> |
||||
<el-table-column prop="name" label="角色名称" align="center"></el-table-column> |
||||
<el-table-column prop="description" label="角色描述" align="center"></el-table-column> |
||||
<el-table-column label="权限列表" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span class="ellipsis">{{ scope.row.permissionName }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作" align="center"> |
||||
<template slot-scope="scope"> |
||||
<el-button type="text" @click="check(scope.row)">查看</el-button> |
||||
<el-button type="text" @click="edit(scope.row)">修改</el-button> |
||||
<el-button type="text" @click="del(scope.row)">删除</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</template> |
||||
</Background-list> |
||||
</div> |
||||
<!-- 添加权限 --> |
||||
<el-dialog |
||||
:title="titleText" |
||||
:visible.sync="isAddjurisdiction" |
||||
width="70%" |
||||
center |
||||
@close="closeAdd" |
||||
:close-on-click-modal="false" |
||||
> |
||||
<el-form ref="jurForm" :model="jurForm"> |
||||
<div class="jurTitle flex-center"> |
||||
<el-form-item> |
||||
<p class="text_color">角色名称</p> |
||||
<el-input :disabled="titleText==='查看权限'" placeholder="请输入角色名称" v-model="newRole.name"></el-input> |
||||
</el-form-item> |
||||
<el-form-item class="mal50"> |
||||
<p class="text_color">角色描述</p> |
||||
<el-input :disabled="titleText==='查看权限'" placeholder="请输入角色描述" v-model="newRole.description"></el-input> |
||||
</el-form-item> |
||||
</div> |
||||
</el-form> |
||||
<p class="text_color mab10">权限</p> |
||||
<div> |
||||
<!-- 权限框--渲染组件取值 --> |
||||
<el-row :gutter="10"> |
||||
<!-- 有空改为固定的4个,循环的数据太恶心了 --> |
||||
|
||||
<!-- 工作台默认时存在的 --> |
||||
<el-col :span="6" class="flex-column-content"> |
||||
<p class="text_color">工作台</p> |
||||
<SystemTree :Treedata="workTree" :ids="treeIds" @getNode="getNode"></SystemTree> |
||||
</el-col> |
||||
<el-col :span="6" v-for="item in jurTreeData" :key="item.id"> |
||||
<div class="flex-column-content"> |
||||
<p class="text_color">{{ item.name }}</p> |
||||
<SystemTree :Treedata="[item]" :ids="treeIds" @getNode="getNode"></SystemTree> |
||||
</div> |
||||
</el-col> |
||||
</el-row> |
||||
</div> |
||||
<span slot="footer" class="dialog-footer"> |
||||
<cancel type="primary" round @click.native="isAddjurisdiction = false">取 消</cancel> |
||||
<sure v-show="titleText==='新增权限'" type="primary" round @click.native="addSure('jurForm')">确 定</sure> |
||||
<sure v-show="titleText==='编辑权限'" type="primary" round @click.native="editBtn('jurForm')">确 定</sure> |
||||
<sure v-show="titleText===''" type="primary" round @click.native="addSure('jurForm')">确 定</sure> |
||||
</span> |
||||
</el-dialog> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { getPermissionIds,rolePermissionList, queryPermission, delRolePermission, jurTree, newAddRolePermission, editRolePermission } from '../../utils/api'; |
||||
import sure from '../common/sure_btn'; |
||||
import cancel from '../common/cancel_btn'; |
||||
export default { |
||||
components: { |
||||
sure, |
||||
cancel |
||||
}, |
||||
data() { |
||||
return { |
||||
|
||||
// 权限假数据 |
||||
jurisdiction: [], |
||||
isAddDepartment: false, |
||||
// 表单 |
||||
jurForm: { |
||||
jurisdictionId: '' |
||||
}, |
||||
titleText:'', |
||||
pageNo: 1, |
||||
pageNumber: 10, |
||||
totals: 1, |
||||
totalPage: 1, |
||||
isAddjurisdiction: false, |
||||
jurTreeData: [],//树渲染 |
||||
// 新增员工数据 |
||||
newRole: { |
||||
name: '', |
||||
description: '', |
||||
permissionIds: [] |
||||
}, |
||||
workTree:[], |
||||
name:'', |
||||
description:'', |
||||
// // 传给组件高亮的数据 |
||||
treeIds:[], |
||||
// 查看时的数据 |
||||
watchTreeData:[], |
||||
needID:0, |
||||
totalCount:10, |
||||
}; |
||||
}, |
||||
mounted() { |
||||
|
||||
}, |
||||
created(){ |
||||
this.getData(); |
||||
this.getjurTree(); |
||||
// this.changeData(this.testData) |
||||
}, |
||||
watch: { |
||||
jurTreeData: { |
||||
handler(newValue, oldValue) { |
||||
}, |
||||
deep: true |
||||
} |
||||
}, |
||||
methods: { |
||||
// 改造树的数据,遍历添加字段 |
||||
// 父子级关联需要半勾选效果,需要进行特殊数据处理 |
||||
changeData(testData){ |
||||
let that = this |
||||
let myArr =JSON.parse(JSON.stringify(this.treeIds) ) |
||||
// 删除了父级1,2,3,4,实现半勾选效果 |
||||
if(myArr.indexOf(1)!==-1){ |
||||
myArr.splice(myArr.indexOf(1),1) |
||||
} |
||||
if(myArr.indexOf(2)!==-1){ |
||||
myArr.splice(myArr.indexOf(2),1) |
||||
} |
||||
if(myArr.indexOf(3)!==-1){ |
||||
myArr.splice(myArr.indexOf(3),1) |
||||
} |
||||
if(myArr.indexOf(4)!==-1){ |
||||
myArr.splice(myArr.indexOf(4),1) |
||||
} |
||||
// 第二级的删除该id,实现半勾选 |
||||
// 后台人力资源管理系统 |
||||
if(myArr.indexOf(9)!==-1){ |
||||
myArr.splice(myArr.indexOf(9),1) |
||||
} |
||||
// 后台客户资源 |
||||
if(myArr.indexOf(10)!==-1){ |
||||
myArr.splice(myArr.indexOf(10),1) |
||||
} |
||||
// 工作台客户资源 |
||||
if(myArr.indexOf(120)!==-1){ |
||||
myArr.splice(myArr.indexOf(120),1) |
||||
} |
||||
// 工作台担保贷后 |
||||
if(myArr.indexOf(7)!==-1){ |
||||
myArr.splice(myArr.indexOf(7),1) |
||||
} |
||||
// 后台担保,待修改 |
||||
// if(myArr.indexOf(11)!==-1){ |
||||
// myArr.splice(myArr.indexOf(11),1) |
||||
// } |
||||
|
||||
testData.map(e=>{ |
||||
// 每次都设置为false,非选中 |
||||
this.$set(e,'checked',false) |
||||
// 判断ids,设置高亮 |
||||
if(myArr.length!==0){ |
||||
if(myArr.indexOf(e.id)!==-1){ |
||||
this.$set(e,'checked',true) |
||||
} |
||||
}else{ |
||||
this.$set(e,'checked',false) |
||||
} |
||||
// 查看把所有都禁了 |
||||
if(this.titleText === '查看权限'){ |
||||
this.$set(e,'disabled',true) |
||||
}else{ |
||||
// 因为是浅拷贝,需要解除 |
||||
this.$set(e,'disabled',false) |
||||
} |
||||
// 新增权限时,全部取消选中 |
||||
if(this.titleText === '新增权限'){ |
||||
this.$set(e,'checked',false) |
||||
} |
||||
// 全部展开 |
||||
this.$set(e,'expand',true) |
||||
// e.ifVisible = false,e.ischeck = false |
||||
if(e.children&&e.children.length!==0){ |
||||
that.changeData(e.children) |
||||
} |
||||
|
||||
// 待删除------担保函,暂时进行禁用 |
||||
// 后续做成活的权限,删除角色系统时,删掉。---估计不太可能了,暂时不管 |
||||
if(e.name==='担保业务管理系统'){ |
||||
this.$set(e,'disabled',true) |
||||
if(e.children){ |
||||
e.children.map(i=>{ |
||||
this.$set(i,'disabled',true) |
||||
if(i.children){ |
||||
i.children.map(q=>{ |
||||
this.$set(q,'disabled',true) |
||||
}) |
||||
} |
||||
}) |
||||
} |
||||
} |
||||
}) |
||||
}, |
||||
// 查询角色权限列表 |
||||
async getData() { |
||||
let res = await rolePermissionList({ |
||||
page: this.pageNo, |
||||
size: this.pageNumber |
||||
}); |
||||
this.jurisdiction = res.data.list; |
||||
this.totals = res.data.totalCount; |
||||
this.totalPage = res.data.totalPage; |
||||
this.totalCount = res.data.totalCount |
||||
}, |
||||
getSize(val){ |
||||
this.pageNo=1 |
||||
this.pageNumber=val |
||||
this.getData() |
||||
}, |
||||
// 查询所有权限树形结构 |
||||
async getjurTree() { |
||||
let res = await jurTree(); |
||||
this.jurTreeData = res.data; |
||||
this.jurTreeData.map(e=>{ |
||||
if(e.name=='客户资源管理系统'||e.name=='担保业务管理系统'||e.name=='保后业务管理系统'){ |
||||
this.workTree.push(e) |
||||
this.jurTreeData.splice(this.jurTreeData.findIndex(i=>{return i.name==e.name}),1) |
||||
} |
||||
}) |
||||
this.changeData(this.jurTreeData) |
||||
this.changeData(this.workTree) |
||||
}, |
||||
// 查看权限 --- 应该是禁用 |
||||
async check(row) { |
||||
this.treeIds = [] |
||||
this.titleText = '查看权限' |
||||
this.addjurisdiction(); |
||||
this.newRole.name = row.name; |
||||
this.newRole.description = row.description; |
||||
let ids = await getPermissionIds({roleId:row.roleId}) |
||||
this.treeIds = ids.data |
||||
// 修改一下数据样式 |
||||
this.changeData(this.jurTreeData) |
||||
this.changeData(this.workTree) |
||||
|
||||
}, |
||||
async edit(row) { |
||||
this.treeIds = [] |
||||
this.newRole.permissionIds=[] |
||||
this.titleText = '编辑权限' |
||||
this.newRole.name = row.name; |
||||
this.newRole.description = row.description; |
||||
this.newRole.roleId = row.roleId; |
||||
this.isAddjurisdiction = true; |
||||
// 点击编辑的时候,把id传过去,如果点击的非编辑,则传一个 |
||||
this.needID = row.roleId |
||||
|
||||
|
||||
let ids = await getPermissionIds({roleId:row.roleId}) |
||||
|
||||
// 取得了勾选的ids |
||||
this.newRole.permissionIds = ids.data |
||||
this.treeIds = ids.data |
||||
// 修改一下数据样式 |
||||
this.changeData(this.jurTreeData) |
||||
this.changeData(this.workTree) |
||||
|
||||
}, |
||||
del(row) { |
||||
this.$confirm('确定要删除该角色吗?', '提示', { |
||||
type: 'warning' |
||||
}) |
||||
.then(() => { |
||||
delRolePermission({ roleId: row.roleId }) |
||||
.then((res) => { |
||||
this.$message.success('删除成功'); |
||||
this.getData(); |
||||
}) |
||||
.catch((res) => {}); |
||||
}) |
||||
.catch(() => {}); |
||||
}, |
||||
currentChange() {}, |
||||
closeAdd() { |
||||
this.$refs.jurForm.resetFields(); |
||||
}, |
||||
// 新增弹框 |
||||
addjurisdiction(val) { |
||||
this.treeIds = [] |
||||
this.newRole.permissionIds = [] |
||||
if(val==='add'){ |
||||
this.titleText = '新增权限' |
||||
} |
||||
this.jurForm.jurisdictionId = ''; |
||||
this.isAddjurisdiction = true; |
||||
this.newRole.name = ''; |
||||
this.newRole.description = ''; |
||||
this.changeData(this.jurTreeData) |
||||
this.changeData(this.workTree) |
||||
|
||||
}, |
||||
|
||||
// 新增角色权限 |
||||
async addSure(val) { |
||||
this.treeIds=[] |
||||
// 重新改造数据 |
||||
this.changeData(this.jurTreeData) |
||||
this.changeData(this.workTree) |
||||
|
||||
if(!this.newRole.name){ |
||||
this.$message.error('请填写角色名称后再提交') |
||||
}else{ |
||||
let res = await newAddRolePermission(this.newRole); |
||||
if (res.code === 10000) { |
||||
this.getData(); |
||||
this.isAddjurisdiction = false; |
||||
this.$store.commit("routerData", { router: false });// 重置路由权限 |
||||
} |
||||
} |
||||
}, |
||||
// 接收多个组件传来的值 |
||||
getNode(data, checked) { |
||||
if (checked === true) { |
||||
this.newRole.permissionIds.push(data); |
||||
this.newRole.permissionIds = [...new Set(this.newRole.permissionIds)]; |
||||
} else { |
||||
// 为false,则删除,且遍历数组,删除所有children的值 |
||||
this.newRole.permissionIds.splice(this.newRole.permissionIds.indexOf(data), 1); |
||||
} |
||||
}, |
||||
// 编辑确定按钮 |
||||
async editBtn(val){ |
||||
|
||||
if(!this.newRole.name){ |
||||
this.$message.error('请输入角色名称') |
||||
}else{ |
||||
let res = await editRolePermission(this.newRole) |
||||
if (res.code === 10000) { |
||||
this.getData(); |
||||
this.$forceUpdate |
||||
this.isAddjurisdiction = false; |
||||
this.$store.commit("routerData", { router: false });// 重置路由权限 |
||||
} |
||||
} |
||||
}, |
||||
// biangeng |
||||
changeInput(){ |
||||
// this.treeIds = this.newRole.permissionIds |
||||
}, |
||||
getPaging(val){ |
||||
this.pageNo = val |
||||
|
||||
this.getData() |
||||
} |
||||
|
||||
}, |
||||
watch:{ |
||||
isAddjurisdiction(val){ |
||||
if(val===false){ |
||||
this.needID = 0 |
||||
} |
||||
}, |
||||
// newRole(val){ |
||||
// } |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
.system_view { |
||||
text-align: right; |
||||
} |
||||
.jurTitle { |
||||
/deep/ .el-input__inner { |
||||
height: 40px; |
||||
} |
||||
.mal50 { |
||||
margin-left: 50px; |
||||
} |
||||
} |
||||
.mab10 { |
||||
margin-bottom: 10px; |
||||
} |
||||
.text_color { |
||||
color: #00b9ff; |
||||
} |
||||
.main{ |
||||
min-height: 755px; |
||||
} |
||||
</style> |
||||
|
||||
|
@ -0,0 +1,739 @@ |
||||
<template> |
||||
<div> |
||||
<!-- 担保函 --> |
||||
<div v-show="loans" class="mat20 bgw shadow radius10 list-box"> |
||||
<div class="flex-between search-box"> |
||||
<div class="flex-center"> |
||||
<p class="fz-16 mgr10 font-blue mgl20">流程状态</p> |
||||
<el-select v-model="processValue" clearable placeholder="请选择" @change="getProcess(1,keyWord,processValue)"> |
||||
<el-option v-for="item in processStatus" :key="item.value" :label="item.label" :value="item.value"> |
||||
</el-option> |
||||
</el-select> |
||||
</div> |
||||
<div class="mgr10 flex-center"> |
||||
<el-input class="ht40" clearable v-model="keyWord" @keyup.enter.native="getProcess(1,keyWord,processValue)" placeholder="业务编号/客户名称" ></el-input> |
||||
<el-button class="ht40 btn-pdt mgl10" type="primary" plain round @click="download">导出</el-button> |
||||
<el-button class="ht40 mgl10 btn-pdt" type="primary" round @click="getProcess(1,keyWord,processValue)">查询</el-button> |
||||
</div> |
||||
</div> |
||||
<div class="pdlr20 wrap self"> |
||||
<el-table :data="processData" stripe header-align="center" class="" @selection-change="handleSelectionChange" :row-key="getRowKeys"> |
||||
<el-table-column type="selection" width="30" align="center" :reserve-selection="true"></el-table-column> |
||||
<el-table-column type="index" width="60" label="序号" align="center"></el-table-column> |
||||
<el-table-column prop="businessCode" label="业务编号" width="100" align="center"></el-table-column> |
||||
<el-table-column prop="name" label="客户名称" align="center"></el-table-column> |
||||
<el-table-column prop="phone" label="联系电话" align="center"></el-table-column> |
||||
<el-table-column prop="businessType" label="业务类别" align="center"></el-table-column> |
||||
<el-table-column prop="loanMoney" label="担保额度(万元)" min-width="100" align="center"></el-table-column> |
||||
<el-table-column prop="loanTern" label="担保期限" align="center"></el-table-column> |
||||
<el-table-column prop="passingTime" label="贷审会日期" align="center"></el-table-column> |
||||
<el-table-column label="审批状态" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span :style="'color:'+scope.row.color">{{scope.row.statusText}}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="业务状态" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span :style="'color:'+scope.row.businessColor">{{ scope.row.businessText }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作状态" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span :style="'color:'+scope.row.operatingColor">{{ scope.row.operatingText }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作" width="200" align="center"> |
||||
<template slot-scope="scope"> |
||||
<el-button type="text" v-if="scope.row.isFgJl == 1 && scope.row.operatingText !== '已处理'&&scope.row.businessStatus !== 3" @click="letterData(scope.row,1)">担保函</el-button> |
||||
<el-button type="text" v-if="scope.row.isFgJl != 1 && scope.row.operatingText !== '已处理'&&scope.row.businessStatus !== 3" @click="letterData(scope.row,3)">确认</el-button> |
||||
<el-button type="text" @click="letterData(scope.row,2)">查看</el-button> |
||||
<el-button type="text" @click="auditProgressPop(scope)">审核进度</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<AuditProgress v-if="visible" :visible.sync="visible" :businessId.sync="businessId"></AuditProgress> |
||||
|
||||
|
||||
<div class="pagination sorter self"> |
||||
<p v-if="processData.length!==0">{{ pageNo }}/{{ totalPage }}页</p> |
||||
<el-pagination |
||||
:hide-on-single-page="processData.length===0" |
||||
background |
||||
:page-sizes="[10, 15, 20, 50]" |
||||
:page-size="10" |
||||
layout="total,prev,pager,next,jumper,sizes" |
||||
@current-change="currentChange" |
||||
:current-page.sync="pageNo" |
||||
:total="totals" |
||||
@size-change="handleSizeChange" > |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
<!-- 担保函展示 --> |
||||
<div v-if="!loans" v-loading="screenshot"> |
||||
<div ref="imageTofile"> |
||||
<div class="shadow radius10 mgt20 pdb10"> |
||||
<div class="mga printOrder-data wd95"> |
||||
<div class="self tx-center border-b pdt20 pdb20 print-top"> |
||||
<p style="font-size:20px;font-weight: 900;">担保承诺函</p> |
||||
<!-- 仅查看时显示 --> |
||||
<el-button v-show="operationType === 2 && letterOfPrint" class="print-btn" @click="toPrint()">打印</el-button> |
||||
</div> |
||||
<div class="mgt40 pdl30 pdr30 print-text"> |
||||
<strong style="font-size:18px">{{letterValue.bank}} :</strong> |
||||
<!-- 生成/确定 担保函的文字--处于非放款通知的情况下 --> |
||||
<div> |
||||
<p v-show="operationType !== 2" class="fz-20 mgt20" style="line-height:40px"> |
||||
根据<span class="letter-key">{{letterValue.name}}</span>的贷款担保申请, 经我公司项目贷审会研究, 同意为其在贵行申请的贷款提供担保, 特向贵行提供承诺。 本承诺系我公司同意与贵行签订保证合同的意向, 一切权利义务以保证合同为准! |
||||
</p> |
||||
<!-- 查看担保函的文字 --> |
||||
<p v-show="operationType === 2" class="mgt20" style="line-height:40px;font-size:18px"> |
||||
根据<span class="letter-key">{{letterValue.name}}</span>的贷款担保申请, 经我公司<span class="letter-key">{{letterValue.passingTime}}</span>项目贷审会研究, 同意为其在贵行申请的贷款提供<span class="letter-key">{{letterValue.loanMoney}}</span>万元 担保,期限<span class="letter-key">{{letterValue.loanTern}}</span>, 特向贵行提供承诺。 本承诺系我公司同意与贵行签订保证合同的意向, 一切权利义务以保证合同为准! |
||||
</p> |
||||
</div> |
||||
<!-- 生成担保函时展示 --> |
||||
<div class="mgl40 mgt20" v-show="operationType !== 2"> |
||||
<div class="df"> |
||||
<p class="fz-20 guarantee-Text-wd not-zoom">客户名称:</p> |
||||
<p class="fz-20">{{letterValue.name}}</p> |
||||
</div> |
||||
<div class="df mgt10"> |
||||
<p class="fz-20 guarantee-Text-wd not-zoom">贷审会日期:</p> |
||||
<p class="fz-20">{{letterValue.passingTime}}</p> |
||||
</div> |
||||
<div class="df mgt10"> |
||||
<p class="fz-20 guarantee-Text-wd not-zoom">担保金额(万元):</p> |
||||
<p class="fz-20" v-text="`${letterValue.loanMoney} (大写:${letterValue.guaranteeMoney})`"></p> |
||||
</div> |
||||
<div class="df mgt10"> |
||||
<p class="fz-20 guarantee-Text-wd not-zoom">担保期限:</p> |
||||
<p class="fz-20">{{letterValue.loanTern}}</p> |
||||
</div> |
||||
</div> |
||||
<div class="wd100 flex-end-content mgb20" :class="operationType === 2 ? 'print' : ''"> |
||||
<div class="mgr50 print-bottom" style="font-size:18px"> |
||||
<strong>大庆市工商业融资担保有限公司</strong> |
||||
<div class="mgl40 mgt10"> |
||||
<p>法定代表人:</p> |
||||
<p class="mgt10">或授权代理人:</p> |
||||
<p class="mgt10 ">  年   月   日</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div v-show="operationType !== 2"> |
||||
<div class="mgt20 left-border fz-16"><p class="c-black mgl10">附件</p></div> |
||||
<div class="shadow radius10 mgt20 pdr20 flex-center"> |
||||
<div v-for="(item,index) in fileList" :key="index" class="mgr20 mgt20 mab20"> |
||||
<span class="fz-16 mgl20 cur" @click="preview(item)">{{URLsubstring(item)}}</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<!-- 担保函--确认 --> |
||||
<div v-show="operationType !== 2"> |
||||
<div v-show="operationType === 1" class="mgt20 left-border fz-16"><p class="c-black mgl10">审核</p></div> |
||||
<div v-show="operationType === 3" class="mgt20 left-border fz-16"><p class="c-black mgl10">担保函确认</p></div> |
||||
<div class="shadow radius10 mgt20 mgb20 pdr20"> |
||||
<el-form label-position="right" label-width="80px" class="mgr20 mgt20 mab20"> |
||||
<el-form-item label="审核意见"> |
||||
<el-input |
||||
class="mgl20 wd100" |
||||
type="textarea" |
||||
:rows="3" |
||||
placeholder="请输入审核意见" |
||||
v-model="letterValue.auditOpinion"> |
||||
</el-input> |
||||
</el-form-item> |
||||
</el-form> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<!-- 查看时的按钮 --> |
||||
<div class="fj-center"> |
||||
<!-- <el-button @click="toImage($refs.imageTofile)">点击上传base64到服务器测试</el-button> --> |
||||
<!-- <el-button v-if="sendShow" class="mgr20" @click="toImage($refs.imageTofile)">抄送</el-button> --> |
||||
|
||||
<el-button v-show="operationType === 2" type="primary bd0" class="mgt20" round @click="downloadLetter">导出</el-button> |
||||
</div> |
||||
<!-- 确认按钮 --> |
||||
<div v-show="operationType === 1 || operationType === 3" class="df fj-end mgt30 mgb30"> |
||||
<div class="df"> |
||||
<el-button plain type="primary" class="mgr20" round @click="backTo">返回</el-button> |
||||
<el-button v-show="operationType === 1" type="success" class="mgr20" v-preventReClick round @click="sumbitOpinion('提交',2)">提交</el-button> |
||||
<el-button v-show="operationType === 3" type="success" class="mgr20" v-preventReClick round @click="sumbitOpinion('确认',2)">确认</el-button> |
||||
<el-button type="warning" class="mgr20" v-preventReClick round @click="sumbitOpinion('驳回',4)">驳回</el-button> |
||||
</div> |
||||
</div> |
||||
|
||||
<!-- 审核流程和业务流程 --> |
||||
<processTemp></processTemp> |
||||
|
||||
<!-- 当前页面预览弹框 --> |
||||
<el-dialog :visible.sync="showPreviewImg" style="margin-top:-7vh"> |
||||
<div class="tx-center"> |
||||
<img :src="previewImg" class="el-image-viewer__img" style="transform: scale(1) rotate(0deg);margin-top: -1px; max-height: 100%; max-width: 100%;"> |
||||
</div> |
||||
</el-dialog> |
||||
|
||||
<!-- 预览pdf --> |
||||
<pdf :visible.sync="pdfVisible" :src.sync="pdfSrc"></pdf> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { guaranteeLetterList, excelExportLetter, updateStatus, exportGuaranteeLetter,copySend ,designFrom,letterDetail } from '../../utils/api' |
||||
import { constants } from 'zlib'; |
||||
import core from '../../utils/core' |
||||
|
||||
export default { |
||||
props:{ |
||||
|
||||
}, |
||||
data() { |
||||
return { |
||||
loans: true, |
||||
//流程状态 |
||||
processValue: '', |
||||
processStatus: [{ |
||||
label: '审核中', |
||||
value: 1 |
||||
}, |
||||
{ |
||||
label: '已审核', |
||||
value: 2 |
||||
}, |
||||
{ |
||||
label: '已驳回', |
||||
value: 4 |
||||
}], |
||||
keyWord: '',//搜索框 |
||||
pageNo: 1, |
||||
pageNum: 10, |
||||
totals: 1, |
||||
processData: [],//列表数据 |
||||
multipleSelection: [],//选择的数据 |
||||
guaranteeMoney: '',//担保金额 |
||||
totalPage: 1, |
||||
|
||||
//担保函数据 |
||||
letterValue: { |
||||
businessId: '',//业务id |
||||
bank: '',//银行 |
||||
name: '',//客户名称 |
||||
passingTime: '',//贷审会日期 |
||||
loanMoney: '',//担保金额 |
||||
guaranteeMoney: '',//担保金额转格式 |
||||
file: '',//会议纪要 |
||||
loanTern: '',//担保期限 |
||||
auditOpinion: '',//审核意见 |
||||
roleId: ''//角色id |
||||
}, |
||||
operationType: 1,//列表操作状态 |
||||
letterOfPrint: true,//打印按钮的显隐 |
||||
printWidth: false,//打印时改变打印内容宽度 |
||||
fileList: [],//附件文件列表 |
||||
showPreviewImg: false,//图片预览 |
||||
previewImg:'',//查看预览文件 |
||||
pdfVisible: false,//pdf弹框 |
||||
pdfSrc: '',//pdf文件 |
||||
visible:false, |
||||
businessId:'', |
||||
// :0, |
||||
fromData:[],// 表单值 |
||||
upDataArr:[],// 表单限制文件 |
||||
screenshot:false,//截图时的加载 |
||||
sendShow:false |
||||
|
||||
}; |
||||
}, |
||||
filters:{ |
||||
linkmanFilter(val){ |
||||
switch (val) { |
||||
case '0': return '个人' |
||||
break; |
||||
case '1': return '企业' |
||||
break; |
||||
} |
||||
}, |
||||
applyDeadline(val){ |
||||
switch (val) { |
||||
case 0:return '1个月' |
||||
break; |
||||
case 1:return '3个月' |
||||
break; |
||||
case 2:return '6个月' |
||||
break; |
||||
case 3:return '9个月' |
||||
break; |
||||
case 4:return '12个月' |
||||
break; |
||||
case 5:return '24个月' |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
}, |
||||
}, |
||||
computed:{ |
||||
num(){ |
||||
|
||||
} |
||||
}, |
||||
watch:{ |
||||
loans:function(val){ |
||||
if(val){ |
||||
this.getProcess(this.pageNo,this.keyWord,this.processValue) |
||||
}else{ |
||||
// this.designFrom()// 动态表单 |
||||
} |
||||
this.$store.commit("loansData", { loans: this.loans }); |
||||
}, |
||||
|
||||
}, |
||||
destroyed(){},// 销毁组件 |
||||
mounted(){ |
||||
// 判断是否由待处理哪里跳转过来的,每次触发后删除 |
||||
if(sessionStorage.getItem('decideJump')){ |
||||
let data = JSON.parse(sessionStorage.getItem('decideJump')) |
||||
data.id = data.detailId |
||||
data.status = data.approveStatus |
||||
data.handleStatus = data.operatingStatus |
||||
// 判断操作 |
||||
this.loans = false //判断详情显示 |
||||
if(data.btn==='担保函'){ |
||||
this.operationType = 1 |
||||
this.letterDetail(data) |
||||
}else if(data.btn==='确认'){ |
||||
this.operationType = 3 |
||||
this.letterDetail(data) |
||||
} |
||||
sessionStorage.removeItem('decideJump') |
||||
// 读取抄送状态,当前是否处于抄送查看, |
||||
}else if(sessionStorage.getItem('fromCopyTo')){ |
||||
let data = JSON.parse(sessionStorage.getItem('fromCopyTo')) |
||||
this.loans = false // 进入详情 |
||||
this.operationType = 2 |
||||
// 判断是否来自个人效率非抄送列表 |
||||
if(sessionStorage.getItem('private')==='查看'){ |
||||
this.letterDetail(data) |
||||
}else{ |
||||
let that = this |
||||
this.letterValue = { |
||||
businessId: data.businessId,//业务id |
||||
bank: data.bank,//银行 |
||||
name: data.clientName,//客户名称 |
||||
passingTime: data.passingTime,//贷审会日期 |
||||
loanMoney: data.loanMoney,//担保金额 |
||||
guaranteeMoney: that.core.fMoney3(data.loanMoney),//担保金额转格式 |
||||
file: '',//会议纪要 |
||||
loanTern: data.loanTern,//担保期限 |
||||
auditOpinion: '',//审核意见 |
||||
roleId: ''//角色id |
||||
} |
||||
} |
||||
// this.disable = true// 禁用表单 |
||||
// this.messageDetail(data.detailId) |
||||
}else{ |
||||
// 读取列表的显示状态 |
||||
this.loans = this.$store.state.guarantee.loans |
||||
this.operationType = this.$store.state.guarantee.operationType |
||||
this.letterValue = this.$store.state.guarantee.letterValue |
||||
this.fileList = this.$store.state.guarantee.fileList |
||||
this.getProcess(this.pageNo,this.keyWord,this.processValue) |
||||
} |
||||
}, |
||||
methods: { |
||||
// 详情--个人效率专用 |
||||
letterDetail(data){ |
||||
letterDetail({id:data.detailId}).then(res=>{ |
||||
let that = this,data = res.data.data |
||||
this.letterValue = { |
||||
businessId: data.businessId,//业务id |
||||
bank: data.bank,//银行 |
||||
name: data.clientName,//客户名称 |
||||
passingTime: data.passingTime,//贷审会日期 |
||||
loanMoney: data.loanMoney,//担保金额 |
||||
guaranteeMoney: that.core.fMoney3(data.loanMoney),//担保金额转格式 |
||||
file: '',//会议纪要 |
||||
loanTern: data.loanTern,//担保期限 |
||||
auditOpinion: '',//审核意见 |
||||
roleId: ''//角色id |
||||
} |
||||
// this.fileList = row.file.split(",") |
||||
// this.$store.commit("fileData", { fileList: this.fileList }); |
||||
this.$store.commit("loansData", { loans: this.loans }); |
||||
this.$store.commit("letterData", { operationType: this.operationType, letterValue: this.letterValue }); |
||||
}) |
||||
}, |
||||
// 担保函-列表 |
||||
async getProcess(val, search, status){ |
||||
let params = { |
||||
page: val, |
||||
size: this.pageNum, |
||||
customerNumberOrName: search, |
||||
status: status |
||||
} |
||||
let res = await guaranteeLetterList(params) |
||||
res.data.list.map(e =>{ |
||||
e.statusText = this.core.auditStatus(e.status).text |
||||
e.color = this.core.auditStatus(e.status).color |
||||
e.businessText = this.core.businessType(e.businessStatus).text |
||||
e.businessColor = this.core.businessType(e.businessStatus).color |
||||
e.operatingText = this.core.operationType(e.operatingStatus).text |
||||
e.operatingColor = this.core.operationType(e.operatingStatus).color |
||||
}) |
||||
this.processData = res.data.list |
||||
// this.processData = [{name:1}]// 调试用 |
||||
this.totals = res.data.totalCount |
||||
if(res.data.totalPage !== 0 ){ |
||||
this.totalPage = res.data.totalPage |
||||
} |
||||
|
||||
}, |
||||
handleSizeChange(val) { |
||||
this.pageNum = val |
||||
this.getProcess(1) |
||||
}, |
||||
//列表数据导出 |
||||
download(){ |
||||
let id = sessionStorage.getItem('userID') |
||||
let str = this.multipleSelection.map(e => e.id) |
||||
let downloadElement = document.createElement('a'); |
||||
downloadElement.href = `${excelExportLetter}?ids=${str?str:[]}&userId=`+id; |
||||
downloadElement.download = '业务申请导出文件'; //下载后文件名 |
||||
document.body.appendChild(downloadElement); |
||||
downloadElement.click(); //点击下载 |
||||
document.body.removeChild(downloadElement); //下载完成移除元素 |
||||
// if(this.multipleSelection.length == 0){ |
||||
// this.$message.error('请先选择担保函数据!'); |
||||
// }else{ |
||||
// } |
||||
}, |
||||
downloadLetter(){ |
||||
window.open(`${exportGuaranteeLetter}?businessId=${this.letterValue.businessId}&roleId=${this.letterValue.roleId}`) |
||||
}, |
||||
getRowKeys(row) { |
||||
return row.Id; |
||||
}, |
||||
handleSelectionChange(val) { |
||||
|
||||
this.multipleSelection = val; |
||||
}, |
||||
currentChange(val){ |
||||
this.getProcess(val) |
||||
}, |
||||
//列表操作-详情 |
||||
letterData(row,operationType){ |
||||
this.loans = false //判断详情显示 |
||||
this.operationType = operationType //列表操作状态 |
||||
//担保函数据 |
||||
this.letterValue = { |
||||
businessId: row.businessId,//业务id |
||||
bank: row.bank,//银行 |
||||
name: row.name,//客户名称 |
||||
passingTime: row.passingTime,//贷审会日期 |
||||
loanMoney: this.core.fMoney(row.loanMoney),//担保金额 |
||||
guaranteeMoney : this.core.fMoney3(row.loanMoney),//担保金额转格式 |
||||
file: row.file,//会议纪要 |
||||
loanTern: row.loanTern,//担保期限 |
||||
auditOpinion: row.auditOpinion,//审核意见 |
||||
roleId: row.roleId //角色id |
||||
} |
||||
this.fileList = row.file.split(",") |
||||
this.$store.commit("fileData", { fileList: this.fileList }); |
||||
this.$store.commit("loansData", { loans: this.loans }); |
||||
this.$store.commit("letterData", { operationType: this.operationType, letterValue: this.letterValue }); |
||||
|
||||
}, |
||||
// 预览文件item |
||||
preview(item){ |
||||
let len = item.length,type = item.substring(len-4,len) |
||||
// 检查后四位,进行格式匹配 |
||||
if(['.jpg','jpeg','.png','.gif','.svg','.psd'].includes(type.toLowerCase())){ |
||||
this.showPreviewImg = true |
||||
this.previewImg = item |
||||
}else if(['.pdf'].includes(type.toLowerCase())){ |
||||
this.pdfVisible = true,//pdf弹框 |
||||
this.pdfSrc = item //pdf文件 |
||||
}else if('.mp4'.includes(type.toLowerCase())){ |
||||
core.downMp4(url,this.URLsubstring(url)) |
||||
} |
||||
else{ |
||||
window.open(`https://view.officeapps.live.com/op/view.aspx?src=${item}`) |
||||
} |
||||
}, |
||||
// 打印功能 |
||||
toPrint(){ |
||||
this.letterOfPrint = false |
||||
this.printWidth = true |
||||
this.$nextTick(()=>{ |
||||
if(this.letterOfPrint === false){ |
||||
var oldstr = document.body.innerHTML |
||||
// 截取需要打印的部分 |
||||
var newstr = document.getElementsByClassName('printOrder-data')[0].innerHTML |
||||
document.body.innerHTML = newstr // 打印区域赋值给body |
||||
window.print();//调用打印 |
||||
// 还原:将旧的页面储存起来,当打印完成后返给给页面。 |
||||
document.body.innerHTML = oldstr |
||||
window.location.reload() |
||||
} |
||||
}) |
||||
}, |
||||
// 提交审核意见 |
||||
sumbitOpinion(text,type){ |
||||
this.$confirm(`确定要${text}该审核意见吗?`, '提示', { |
||||
type: 'warning' |
||||
}).then(() => { |
||||
if(type == 4 && this.letterValue.auditOpinion == ''){ |
||||
return this.$message.error("请先填写审核意见!") |
||||
} |
||||
let params = { |
||||
auditOpinion: this.letterValue.auditOpinion, |
||||
businessId: this.letterValue.businessId, |
||||
status: type |
||||
} |
||||
updateStatus(params).then(res => { |
||||
this.$message.success(`${text}成功`); |
||||
let btnPermissionsStr = sessionStorage.getItem("now-roleBtn").split(','); |
||||
// if(btnPermissionsStr.includes('62')){ |
||||
// this.toImage(this.$refs.imageTofile) |
||||
// }else{ |
||||
this.loans = true |
||||
// this.getProcess(this.pageNo,this.keyWord,this.processValue) |
||||
// } |
||||
}).catch(res => {}); |
||||
}).catch(() => {}); |
||||
}, |
||||
// 返回 |
||||
backTo(){ |
||||
this.loans = true |
||||
}, |
||||
auditProgressPop(data){ |
||||
this.visible=true |
||||
this.businessId = data.row.businessId |
||||
}, |
||||
URLsubstring(url){// 剪切img-url的名称 |
||||
if(url){ |
||||
return url.substring(59,url.length) |
||||
} |
||||
}, |
||||
// 页面元素转图片 |
||||
toImage(el) { |
||||
copySend({ |
||||
businessId:this.letterValue.businessId, |
||||
detailId:this.letterValue.id, |
||||
processId:8 |
||||
}).then(res=>{ |
||||
if(res.code===10000){ |
||||
this.screenshot = false |
||||
this.loans = true |
||||
} |
||||
}).catch(err=>{ |
||||
this.screenshot = false |
||||
}) |
||||
}, |
||||
compare(key){ // 用于对象数组排序 |
||||
return function(value1,value2){ |
||||
let val1=value1[key]; |
||||
let val2=value2[key]; |
||||
return val1-val2; |
||||
} |
||||
}, |
||||
designFrom(){// 表单数据接口 |
||||
designFrom({processId:8}).then(res=>{ |
||||
this.fromData = res.data |
||||
this.fromData.sort(this.compare('id')) |
||||
// this.upDataArr = [] |
||||
// this.upDataArr.push(this.fromData[24].ifRequired,this.fromData[25].ifRequired,this.fromData[26].ifRequired,this.fromData[27].ifRequired,this.fromData[28].ifRequired,this.fromData[29].ifRequired,this.fromData[30].ifRequired,this.fromData[31].ifRequired,this.fromData[32].ifRequired ) |
||||
}) |
||||
}, |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
@page{//清除打印时的页眉页脚--通过margin挤掉 |
||||
size: auto A4 landscape;//设置打印规定的纸张大小 |
||||
margin: 3mm 1cm 3mm; |
||||
} |
||||
@media print { |
||||
.print-top{ |
||||
padding-top: 3.5cm; |
||||
padding-bottom: 1cm; |
||||
} |
||||
.print-text{ |
||||
padding-top: .5cm; |
||||
margin-left: 1.5cm; |
||||
margin-right: 1.5cm; |
||||
} |
||||
.border-b{ |
||||
border-bottom:0 |
||||
} |
||||
.print-bottom{ |
||||
margin-top: 4.5cm; |
||||
} |
||||
} |
||||
.print{ |
||||
margin-top: 200px; |
||||
} |
||||
.print-btn{ |
||||
position:absolute; |
||||
right:0; |
||||
top: 15px; |
||||
} |
||||
.letter-key{ |
||||
font-weight: bold; |
||||
margin: 0 10px; |
||||
} |
||||
.guarantee-Text-wd{ |
||||
width: 180px; |
||||
} |
||||
|
||||
.sorter { |
||||
// position: absolute; |
||||
// bottom: 5%; |
||||
// right: 3%; |
||||
display: flex; |
||||
justify-content: flex-end; |
||||
margin-top: 50px; |
||||
padding-bottom: 20px; |
||||
p { |
||||
color: #cccccc; |
||||
position: absolute; |
||||
left: 50%; |
||||
top: 28%; |
||||
transform: translate(-50%,-50%); |
||||
font-size: 16px; |
||||
} |
||||
} |
||||
.wrap{ |
||||
|
||||
// min-height: 664px; |
||||
min-height: 100%; |
||||
} |
||||
/deep/.el-table .cell{ |
||||
padding: 0; |
||||
} |
||||
/deep/ .el-table-column--selection .cell{ |
||||
padding-left: 0; |
||||
padding-right: 0; |
||||
} |
||||
/deep/ .el-checkbox__inner { |
||||
background: transparent; |
||||
border: 0; |
||||
background-image: url('../../assets/img/btn_per_un.png'); |
||||
background-size: cover; |
||||
width: 20px; |
||||
height: 20px; |
||||
} |
||||
/deep/ .cell .el-checkbox__input .el-checkbox__inner { |
||||
background-color: transparent; |
||||
background-image: url('../../assets/img/btn_per_un.png'); |
||||
background-size: cover; |
||||
width: 20px; |
||||
height: 20px; |
||||
border: 0; |
||||
transition: none; |
||||
} |
||||
/deep/ .el-checkbox { |
||||
width: 20px; |
||||
height: 20px; |
||||
transition: none; |
||||
} |
||||
/deep/ .el-checkbox__input.is-checked + .el-checkbox__label { |
||||
transition: none; |
||||
width: 20px; |
||||
height: 20px; |
||||
} |
||||
/deep/ .el-checkbox__input .el-checkbox__inner::after { |
||||
background: transparent; |
||||
content: ''; |
||||
height: 20px; |
||||
width: 20px; |
||||
border-radius: 50%; |
||||
transition: none; |
||||
} |
||||
|
||||
// 选中后 |
||||
|
||||
/deep/ .el-checkbox__input.is-checked .el-checkbox__inner { |
||||
background-color: transparent; |
||||
transition: none; |
||||
width: 20px; |
||||
height: 20px; |
||||
} |
||||
/deep/ .el-checkbox__input.is-checked .el-checkbox__inner::after { |
||||
content: ''; |
||||
background: transparent; |
||||
background-image: url('../../assets/img/btn_pre.png'); |
||||
|
||||
width: 20px; |
||||
border: 0; |
||||
background-size: cover; |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
transition: none; |
||||
} |
||||
/deep/ .el-table .cell { |
||||
text-align: center; |
||||
text-overflow: clip; |
||||
} |
||||
|
||||
// 分页器样式 |
||||
|
||||
/deep/ .el-pager li { |
||||
border-radius: 50% !important; |
||||
height: 30px; |
||||
width: 30px; |
||||
min-height: 25px !important; |
||||
min-width: 25px !important; |
||||
background: #f2f2f2; |
||||
line-height: 30px; |
||||
text-align: center; |
||||
padding: 0; |
||||
} |
||||
/deep/ .el-form-item { |
||||
margin-bottom: 0; |
||||
} |
||||
/deep/ .el-pagination.is-background .btn-prev { |
||||
background-color: transparent; |
||||
} |
||||
/deep/ .el-form-item__label { |
||||
color: #00b9ff; |
||||
padding: 0; |
||||
} |
||||
/deep/ .el-input__inner { |
||||
border-radius: 20px; |
||||
// background: #fafafa; |
||||
} |
||||
/deep/ .el-pagination .btn-next .el-icon { |
||||
color: #00b9ff; |
||||
font-size: 20px; |
||||
} |
||||
/deep/ .el-pagination .btn-prev .el-icon { |
||||
color: #00b9ff; |
||||
font-size: 20px; |
||||
} |
||||
|
||||
/deep/ .el-table td { |
||||
padding: 0px; |
||||
padding: 8px 0; |
||||
} |
||||
/deep/ .el-table th > .cell { |
||||
|
||||
padding: 0; |
||||
} |
||||
/deep/ .el-pagination.is-background .btn-next { |
||||
background-color: transparent; |
||||
} |
||||
/deep/ .el-input__inner { |
||||
border-radius: 20px; |
||||
height: 35px !important; |
||||
line-height: 35px; |
||||
} |
||||
</style> |
@ -0,0 +1,149 @@ |
||||
<template> |
||||
|
||||
<!-- bug未修复:处于关联状态渲染会出问题,然后修改完权限,输入框输入的时候会导致权限复原 --> |
||||
<!-- 且:会导致严格关联的勾选(即父级勾选,等于全选) --> |
||||
<!-- 父子级不严格关联check-strictly --> |
||||
<!-- 默认选中的id default-checked-keys --> |
||||
<!-- 展开所有节点default-expand-all --> |
||||
<div class="df-column"> |
||||
<div class="radius10 "> |
||||
<el-tree |
||||
default-expand-all |
||||
:data="data" |
||||
check-strictly |
||||
@check-change="checkBox" |
||||
node-key="id" |
||||
:expand-on-click-node="false" |
||||
ref="tree" |
||||
class="mgtb10" |
||||
show-checkbox |
||||
auto-expand-parent |
||||
:default-checked-keys="myIds" |
||||
|
||||
|
||||
> |
||||
<span class="custom-tree-node" slot-scope="{ data }"> |
||||
<span>{{ data.name }}</span> |
||||
</span> |
||||
</el-tree> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import { getPermissionIds} from '../../utils/api' |
||||
export default { |
||||
name: "List", |
||||
props: { |
||||
data: Array, |
||||
needID:Number, |
||||
// ids:Array |
||||
}, |
||||
data(){ |
||||
return{ |
||||
// 设置树 |
||||
|
||||
nodeArr:[],//选中的节点添加进数组 |
||||
myIds:[]// |
||||
} |
||||
}, |
||||
methods:{ |
||||
// 检测实时变更选中,传给父级 |
||||
checkBox(data, checked, indeterminate){ |
||||
// 传父级id过去(这个是关联模式) |
||||
// if(this.getCheckedNodes().length!==0){ |
||||
// let[a]=this.getCheckedNodes() |
||||
// this.$emit('getNodeArr',a,true) |
||||
// } |
||||
|
||||
// 传父级id过去 |
||||
this.myIds.push(data.parentId) |
||||
|
||||
|
||||
this.$emit('getNodeArr',data.parentId,true) |
||||
this.$emit('getNodeArr',data.id,checked) |
||||
|
||||
|
||||
}, |
||||
handleNodeClick(data) { |
||||
}, |
||||
// 选中树节点的处理方式 |
||||
getNode(data) { |
||||
//不需要处理node数据时,不做操作,data为当前节点的数据 |
||||
}, |
||||
|
||||
getCheckedNodes() { |
||||
// 半选的时候获取父级的id |
||||
return this.$refs.tree.getHalfCheckedKeys() |
||||
}, |
||||
// getCheckedKeys() { |
||||
// // 返回选中的id组合 |
||||
// }, |
||||
|
||||
getLight(val){ |
||||
if(val!==0){ |
||||
getPermissionIds({roleId:val}).then(res=>{ |
||||
this.myIds = res.data |
||||
// this.$refs.tree.setCheckedKeys(this.myIds,true) |
||||
})} |
||||
}, |
||||
// debounce(func, wait) { |
||||
// let timer; |
||||
// return function() { |
||||
// let context = this; |
||||
// let args = arguments; |
||||
// if (timer) clearTimeout(timer); |
||||
// let callNow = !timer; |
||||
// timer = setTimeout(() => { |
||||
// timer = null; |
||||
// }, wait) |
||||
// if (callNow) func.apply(context, args); |
||||
// } |
||||
// } |
||||
}, |
||||
created(){ |
||||
this.getLight(this.needID) |
||||
// this.getLight(this.needID) |
||||
}, |
||||
watch:{ |
||||
// needID:function(val,val1){ |
||||
// if(val!==0){ |
||||
// this.debounce(this.getLight(val),500) |
||||
// } |
||||
// }, |
||||
// myIds:function(val){ |
||||
// } |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
.list-item{ |
||||
.item-name{ |
||||
padding: 10px 0 0 0; |
||||
i{ |
||||
margin-right: 10px; |
||||
} |
||||
|
||||
.hover{ |
||||
color: #ccc; |
||||
&:hover{ |
||||
color: #00B9FF; |
||||
} |
||||
} |
||||
span{ |
||||
color: #666; |
||||
} |
||||
} |
||||
.children-item{ |
||||
margin-left: 20px; |
||||
} |
||||
} |
||||
.custom-tree-node { |
||||
flex: 1; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
font-size: 14px; |
||||
padding-right: 10px; |
||||
} |
||||
</style> |
@ -0,0 +1,696 @@ |
||||
<template> |
||||
<div> |
||||
<div v-show="loans" class="mat20 bgw shadow radius10 list-box"> |
||||
<div class="flex-between search-box"> |
||||
<div class="flex-center"> |
||||
<p class="fz-16 mgr10 font-blue mgl20">流程状态</p> |
||||
<el-select v-model="processValue" clearable placeholder="请选择" @change="getProcess(1,keyWord,processValue)"> |
||||
<el-option v-for="item in processStatus" :key="item.value" :label="item.label" :value="item.value"> |
||||
</el-option> |
||||
</el-select> |
||||
</div> |
||||
<div class="mgr10 flex-center"> |
||||
<el-input class="ht40" clearable v-model="keyWord" @keyup.enter.native="getProcess(1,keyWord,processValue)" placeholder="业务编号/客户名称" ></el-input> |
||||
<el-button class="ht40 btn-pdt mgl10" type="primary" plain round @click="download">导出</el-button> |
||||
<el-button class="ht40 mgl10 btn-pdt" type="primary" round @click="getProcess(1,keyWord,processValue)">查询</el-button> |
||||
</div> |
||||
</div> |
||||
<div class="pdlr20 wrap self"> |
||||
<el-table :data="processData" stripe header-align="center" class="" @selection-change="handleSelectionChange" :row-key="getRowKeys"> |
||||
<el-table-column type="selection" width="30" align="center" :reserve-selection="true"></el-table-column> |
||||
<el-table-column type="index" width="60" label="序号" align="center"></el-table-column> |
||||
<el-table-column prop="businessCode" label="业务编号" width="100" align="center"></el-table-column> |
||||
<el-table-column prop="name" label="客户名称" align="center"></el-table-column> |
||||
<el-table-column prop="phone" label="联系电话" align="center"></el-table-column> |
||||
<el-table-column prop="businessType" label="业务类别" align="center"></el-table-column> |
||||
<el-table-column prop="loanMoney" label="担保额度(万元)" min-width="100" align="center"></el-table-column> |
||||
<el-table-column prop="loanTern" label="担保期限" align="center"></el-table-column> |
||||
<el-table-column prop="passingTime" label="贷审会日期" align="center"></el-table-column> |
||||
<el-table-column label="审批状态" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span :style="'color:'+scope.row.color">{{scope.row.statusText}}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="业务状态" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span :style="'color:'+scope.row.businessColor">{{ scope.row.businessText }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作状态" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span :style="'color:'+scope.row.operatingColor">{{ scope.row.operatingText }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作" width="200" align="center"> |
||||
<template slot-scope="scope"> |
||||
<el-button type="text" @click="letterData(scope.row,2)">查看</el-button> |
||||
<!-- 确认A/B角/资产部 --> |
||||
<el-button type="text" v-show="scope.row.operatingText !== '已处理'&&scope.row.businessStatus !== 3" @click="letterData(scope.row,3)">确认</el-button> |
||||
<el-button type="text" @click="auditProgressPop(scope)">审核进度</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<AuditProgress v-if="visible" :visible.sync="visible" :businessId.sync="businessId"></AuditProgress> |
||||
|
||||
<div class="pagination sorter self"> |
||||
<p v-if="processData.length!==0">{{ pageNo }}/{{ totalPage }}页</p> |
||||
<el-pagination |
||||
:hide-on-single-page="processData.length===0" |
||||
background |
||||
:page-sizes="[10, 15, 20, 50]" |
||||
:page-size="10" |
||||
layout="total,prev,pager,next,jumper,sizes" |
||||
@current-change="currentChange" |
||||
:current-page.sync="pageNo" |
||||
:total="totals" |
||||
@size-change="handleSizeChange"> |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
|
||||
<!-- 担保函展示 --> |
||||
<div v-if="!loans" ref="imageTofile" v-loading="screenshot"> |
||||
<div class="shadow radius10 mgt20 pdb10"> |
||||
<div class="mga printOrder-data wd95"> |
||||
<div class="self tx-center border-b pdt20 pdb20 print-top"> |
||||
<p style="font-size:20px;font-weight: 900;">放款通知</p> |
||||
<!-- 仅查看时显示 --> |
||||
<el-button v-show="operationType === 2 && letterOfPrint" class="print-btn" @click="toPrint()">打印</el-button> |
||||
</div> |
||||
<div class="mgt40 pdl30 pdr30 print-text"> |
||||
<strong style="font-size:18px">{{letterValue.bank}} :</strong> |
||||
<!-- 非打印展示 --> |
||||
<div :class="letterOfPrint?'before-print':'do-print'"> |
||||
<div> |
||||
<p class="fz-18 mgt20" style="line-height:40px"> |
||||
我公司同意贵行为该公司放款。 |
||||
</p> |
||||
</div> |
||||
<!-- 生成担保函时展示 --> |
||||
<div class="mgl40 mgt20"> |
||||
<div class="df"> |
||||
<p class="fz-16 not-zoom">客户名称:</p> |
||||
<p class="fz-16">{{letterValue.name}}</p> |
||||
</div> |
||||
<div class="df mgt10"> |
||||
<p class="fz-16 mgr30 not-zoom">放款额度(万元):</p> |
||||
<p class="fz-16" v-text="`${letterValue.loanMoney} (大写:${letterValue.guaranteeMoney})`"></p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<!-- 打印时展示 --> |
||||
<div :class="!letterOfPrint?'before-print':'do-print'" style="line-height:40px;font-size:18px;"> |
||||
<p class="mgt20 print-main" > |
||||
我公司同意贵行为 <span style="font-weight: bold;">{{letterValue.name}}</span> 放款人民币 <span style="font-weight: bold;">{{letterValue.loanMoney}}</span>万元整 (大写:<span style="font-weight: bold;">{{letterValue.guaranteeMoney}}</span>)。 |
||||
</p> |
||||
<p class="mgt20" > |
||||
特此通知! |
||||
</p> |
||||
</div> |
||||
<div class="wd100 flex-end-content mgb20" :class="operationType === 2 ? 'print' : ''"> |
||||
<div class="mgr50 print-bottom" style="font-size:18px"> |
||||
<strong>大庆市工商业融资担保有限公司</strong> |
||||
<div class="mgl40 mgt15"> |
||||
<p>法定代表人:</p> |
||||
<p class="mgt15">或授权代理人:</p> |
||||
<p class="mgt15 ">  年   月   日</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<!-- 担保函--确认 --> |
||||
<div v-show="operationType !== 2"> |
||||
<div v-show="operationType === 1" class="mgt20 left-border fz-16"><p class="c-black mgl10">审核</p></div> |
||||
<div v-show="operationType === 3" class="mgt20 left-border fz-16"><p class="c-black mgl10">放款确认</p></div> |
||||
<div class="shadow radius10 mgt20 mgb20 pdr20"> |
||||
<el-form label-position="right" label-width="80px" class="mgr20 mgt20 mab20"> |
||||
<el-form-item label="审核意见"> |
||||
<el-input |
||||
class="mgl20 wd100" |
||||
type="textarea" |
||||
:rows="3" |
||||
placeholder="请输入审核意见" |
||||
v-model="letterValue.auditOpinion"> |
||||
</el-input> |
||||
</el-form-item> |
||||
</el-form> |
||||
</div> |
||||
</div> |
||||
<!-- 查看时的按钮 --> |
||||
<div class="fj-center"> |
||||
<el-button v-show="operationType === 2" type="primary bd0" class="mgt20" round @click="downloadLetter">导出</el-button> |
||||
</div> |
||||
<!-- 确认按钮 --> |
||||
<div class="df fj-end mgt30 mgb30"> |
||||
<!-- <el-button v-if="sendShow" class="mgr20" @click="toImage($refs.imageTofile)">抄送</el-button> --> |
||||
<div class="df" v-show="operationType === 3"> |
||||
<el-button plain type="primary" class="mgr20" round @click="backTo">返回</el-button> |
||||
<el-button type="success" class="mgr20" round v-preventReClick @click="sumbitOpinion('提交',2)">提交</el-button> |
||||
<el-button type="warning" class="mgr20" round v-preventReClick @click="sumbitOpinion('驳回',4)">驳回</el-button> |
||||
</div> |
||||
</div> |
||||
|
||||
<!-- 审核流程和业务流程 --> |
||||
<processTemp></processTemp> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
|
||||
import {loanNoticeDetail, loanNoticeList, loanNoticeListExport, updateLoanNotice, exportLoanNotice,copySend ,designFrom } from '../../utils/api' |
||||
var myToken = sessionStorage.getItem('token') |
||||
import core from '../../utils/core' |
||||
export default { |
||||
props:{ |
||||
|
||||
}, |
||||
data() { |
||||
return { |
||||
loans: true, |
||||
visible:false, |
||||
businessId:'', |
||||
//流程状态 |
||||
processValue: '', |
||||
processStatus: [{ |
||||
label: '审核中', |
||||
value: 1 |
||||
}, |
||||
{ |
||||
label: '已审核', |
||||
value: 2 |
||||
}, |
||||
{ |
||||
label: '已驳回', |
||||
value: 4 |
||||
}], |
||||
keyWord: '',//搜索框 |
||||
pageNo: 1, |
||||
pageNum: 10, |
||||
totals: 1, |
||||
totalPage: 1, |
||||
|
||||
processData: [],//列表数据 |
||||
multipleSelection: [],//选择的数据 |
||||
guaranteeMoney: '',//担保金额 |
||||
//担保函数据 |
||||
letterValue: { |
||||
businessId: '',//业务id |
||||
bank: '',//银行 |
||||
name: '',//客户名称 |
||||
passingTime: '',//贷审会日期 |
||||
loanMoney: '',//担保金额 |
||||
guaranteeMoney: '',//担保金额转格式 |
||||
file: '',//会议纪要 |
||||
loanTern: '',//担保期限 |
||||
auditOpinion: '',//审核意见 |
||||
roleId: '' //角色id |
||||
}, |
||||
operationType: 1,//列表操作状态 |
||||
letterOfPrint: true,//打印按钮的显隐 |
||||
printWidth: false,//打印时改变打印内容宽度 |
||||
imgFileList: [], |
||||
imgListT: [], |
||||
checkImgList:[], |
||||
inspectionPhotos: [], //图片列表 |
||||
uploadHeaders:{token:myToken},//上传带token |
||||
fromData:[],// 表单值 |
||||
upDataArr:[],// 表单限制文件 |
||||
screenshot:false,//截图时的加载 |
||||
sendShow:false |
||||
|
||||
}; |
||||
}, |
||||
mounted(){ |
||||
// 判断是否由待处理哪里跳转过来的,每次触发后删除 |
||||
if(sessionStorage.getItem('decideJump')){ |
||||
let data = JSON.parse(sessionStorage.getItem('decideJump')) |
||||
data.id = data.detailId |
||||
data.status = data.approveStatus |
||||
data.handleStatus = data.operatingStatus |
||||
// 判断操作 |
||||
this.loans = false //判断详情显示 |
||||
if(data.btn==='确认'){ |
||||
this.operationType = 3 |
||||
this.loanNoticeDetail(data)// 取得详情 |
||||
this.operationType = operationType //列表操作状态 |
||||
this.$store.commit("loansData", { loans: this.loans }); |
||||
this.$store.commit("letterData", { operationType: this.operationType, letterValue: this.letterValue }); |
||||
} |
||||
sessionStorage.removeItem('decideJump') |
||||
// 读取抄送状态,当前是否处于抄送查看, |
||||
}else if(sessionStorage.getItem('fromCopyTo')){ |
||||
let data = JSON.parse(sessionStorage.getItem('fromCopyTo')) |
||||
this.loans = false // 进入详情 |
||||
this.operationType = 2 |
||||
// 判断是否来自个人效率非抄送列表 |
||||
if(sessionStorage.getItem('private')==='查看'){ |
||||
this.loanNoticeDetail(data) |
||||
}else{ |
||||
let that = this |
||||
this.letterValue = { |
||||
businessId: data.businessId,//业务id |
||||
bank: data.bank,//银行 |
||||
name: data.clientName,//客户名称 |
||||
passingTime: data.passingTime,//贷审会日期 |
||||
loanMoney: data.loanMoney,//担保金额 |
||||
guaranteeMoney: that.core.fMoney3(data.loanMoney),//担保金额转格式 |
||||
file: '',//会议纪要 |
||||
loanTern: data.loanTern,//担保期限 |
||||
auditOpinion: '',//审核意见 |
||||
roleId: ''//角色id |
||||
} |
||||
} |
||||
// this.disable = true// 禁用表单 |
||||
// this.messageDetail(data.detailId) |
||||
}else{ |
||||
// 读取列表的显示状态 |
||||
this.loans = this.$store.state.guarantee.loans |
||||
this.operationType = this.$store.state.guarantee.operationType |
||||
this.letterValue = this.$store.state.guarantee.letterValue |
||||
|
||||
this.getProcess(this.pageNo,this.keyWord,this.processValue) |
||||
} |
||||
}, |
||||
watch:{ |
||||
loans:function(val){ |
||||
if(val){ |
||||
this.getProcess(this.pageNo,this.keyWord,this.processValue) |
||||
}else{ |
||||
// this.designFrom()// 动态表单 |
||||
} |
||||
this.$store.commit("loansData", { loans: this.loans }); |
||||
}, |
||||
|
||||
}, |
||||
methods: { |
||||
// 详情 |
||||
loanNoticeDetail(data){ |
||||
|
||||
loanNoticeDetail({id:data.detailId}).then(res=>{ |
||||
let that = this,data = res.data.data |
||||
this.letterValue = { |
||||
businessId: data.businessId,//业务id |
||||
bank: data.bank,//银行 |
||||
name: data.clientName,//客户名称 |
||||
passingTime: data.passingTime,//贷审会日期 |
||||
loanMoney: data.loanMoney,//担保金额 |
||||
guaranteeMoney: that.core.fMoney3(data.loanMoney),//担保金额转格式 |
||||
file: '',//会议纪要 |
||||
loanTern: data.loanTern,//担保期限 |
||||
auditOpinion: '',//审核意见 |
||||
roleId: ''//角色id |
||||
} |
||||
}) |
||||
}, |
||||
// 担保函-列表 |
||||
async getProcess(val, search, status){ |
||||
let params = { |
||||
page: val, |
||||
size: this.pageNum, |
||||
customerNumberOrName: search, |
||||
status: status |
||||
} |
||||
let res = await loanNoticeList(params) |
||||
res.data.list.map(e =>{ |
||||
e.statusText = this.core.auditStatus(e.status).text |
||||
e.color = this.core.auditStatus(e.status).color |
||||
e.businessText = this.core.businessType(e.businessStatus).text |
||||
e.businessColor = this.core.businessType(e.businessStatus).color |
||||
e.operatingText = this.core.operationType(e.operatingStatus).text |
||||
e.operatingColor = this.core.operationType(e.operatingStatus).color |
||||
}) |
||||
this.processData = res.data.list |
||||
this.totals = res.data.totalCount |
||||
if(res.data.totalPage !== 0 ){ |
||||
this.totalPage = res.data.totalPage |
||||
} |
||||
}, |
||||
handleSizeChange(val) { |
||||
this.pageNum = val |
||||
this.getProcess(1) |
||||
}, |
||||
//列表数据导出 |
||||
download(){ |
||||
// if(this.multipleSelection.length == 0){ |
||||
// this.$message.error('请先选择财务确认数据!'); |
||||
// }else{ |
||||
let id = sessionStorage.getItem('userID') |
||||
let str = this.multipleSelection.map(e => e.id) |
||||
// window.open(`${loanNoticeListExport}?ids=${str?str:[]}&userId=`+id) |
||||
let downloadElement = document.createElement('a'); |
||||
downloadElement.href = `${loanNoticeListExport}?ids=${str?str:[]}&userId=`+id; |
||||
downloadElement.download = '业务申请导出文件'; //下载后文件名 |
||||
document.body.appendChild(downloadElement); |
||||
downloadElement.click(); //点击下载 |
||||
document.body.removeChild(downloadElement); //下载完成移除元素 |
||||
// } |
||||
}, |
||||
downloadLetter(){ |
||||
window.open(`${exportLoanNotice}?businessId=${this.letterValue.businessId}&roleId=${this.letterValue.roleId}`) |
||||
}, |
||||
getRowKeys(row) { |
||||
return row.Id; |
||||
}, |
||||
handleSelectionChange(val) { |
||||
this.multipleSelection = val; |
||||
}, |
||||
currentChange(val){ |
||||
this.getProcess(val) |
||||
}, |
||||
//列表操作-详情 |
||||
letterData(row,operationType){ |
||||
this.loans = false //判断详情显示 |
||||
this.operationType = operationType //列表操作状态 |
||||
//担保函数据 |
||||
this.letterValue = { |
||||
businessId: row.businessId,//业务id |
||||
bank: row.bank,//银行 |
||||
name: row.name,//客户名称 |
||||
passingTime: row.passingTime,//贷审会日期 |
||||
loanMoney: this.core.fMoney(row.loanMoney),//担保金额 |
||||
guaranteeMoney : this.core.fMoney3(row.loanMoney),//担保金额转格式 |
||||
file: row.file,//会议纪要 |
||||
loanTern: row.loanTern,//担保期限 |
||||
auditOpinion: row.auditOpinion,//审核意见 |
||||
roleId: row.roleId //角色id |
||||
} |
||||
|
||||
this.$store.commit("loansData", { loans: this.loans }); |
||||
this.$store.commit("letterData", { operationType: this.operationType, letterValue: this.letterValue }); |
||||
}, |
||||
// 打印功能 |
||||
toPrint(){ |
||||
this.letterOfPrint = false |
||||
this.printWidth = true |
||||
this.$nextTick(()=>{ |
||||
if(this.letterOfPrint === false){ |
||||
var oldstr = document.body.innerHTML |
||||
// 截取需要打印的部分 |
||||
var newstr = document.getElementsByClassName('printOrder-data')[0].innerHTML |
||||
document.body.innerHTML = newstr // 打印区域赋值给body |
||||
window.print();//调用打印 |
||||
// 还原:将旧的页面储存起来,当打印完成后返给给页面。 |
||||
document.body.innerHTML = oldstr |
||||
window.location.reload() |
||||
} |
||||
}) |
||||
}, |
||||
// 提交审核意见 |
||||
sumbitOpinion(text,type){ |
||||
this.$confirm(`确定要${text}该审核意见吗?`, '提示', { |
||||
type: 'warning' |
||||
}).then(() => { |
||||
if(type == 4 && this.letterValue.auditOpinion == ''){ |
||||
return this.$message.error("请先填写审核意见!") |
||||
} |
||||
let params = { |
||||
auditOpinion: this.letterValue.auditOpinion, |
||||
businessId: this.letterValue.businessId, |
||||
status: type |
||||
} |
||||
updateLoanNotice(params).then(res => { |
||||
// if(type===2){ |
||||
// this.toImage(this.$refs.imageTofile) |
||||
// }else{ |
||||
this.$message.success(`${text}成功`); |
||||
this.loans = true |
||||
this.getProcess(this.pageNo,this.keyWord,this.processValue) |
||||
// } |
||||
}).catch(res => {}); |
||||
}).catch(() => {}); |
||||
}, |
||||
// 返回 |
||||
backTo(){ |
||||
this.loans = true |
||||
}, |
||||
auditProgressPop(data){ |
||||
this.visible=true |
||||
this.businessId = data.row.businessId |
||||
}, |
||||
// 页面元素转图片 |
||||
toImage(el) { |
||||
copySend({ |
||||
businessId:this.letterValue.businessId, |
||||
detailId:this.letterValue.id, |
||||
processId:10 |
||||
}).then(res=>{ |
||||
if(res.code===10000){ |
||||
this.screenshot = false |
||||
this.loans = true |
||||
// this.getProcess(this.pageNo,this.keyWord,this.processValue) |
||||
} |
||||
}).catch(err=>{ |
||||
this.screenshot = false |
||||
}) |
||||
}, |
||||
compare(key){ // 用于对象数组排序 |
||||
return function(value1,value2){ |
||||
let val1=value1[key]; |
||||
let val2=value2[key]; |
||||
return val1-val2; |
||||
} |
||||
}, |
||||
designFrom(){// 表单数据接口 |
||||
designFrom({processId:10}).then(res=>{ |
||||
this.fromData = res.data |
||||
this.fromData.sort(this.compare('id')) |
||||
// this.upDataArr = [] |
||||
// this.upDataArr.push(this.fromData[24].ifRequired,this.fromData[25].ifRequired,this.fromData[26].ifRequired,this.fromData[27].ifRequired,this.fromData[28].ifRequired,this.fromData[29].ifRequired,this.fromData[30].ifRequired,this.fromData[31].ifRequired,this.fromData[32].ifRequired ) |
||||
}) |
||||
}, |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
@page{//清除打印时的页眉页脚--通过margin挤掉 |
||||
size: auto A4 landscape;//设置打印规定的纸张大小 |
||||
margin: 3mm 1cm 3mm; |
||||
} |
||||
@media print { |
||||
.print-top{ |
||||
padding-top: 3.5cm; |
||||
padding-bottom: 1cm; |
||||
} |
||||
.print-text{ |
||||
padding-top: .5cm; |
||||
margin-left: 1.5cm; |
||||
margin-right: 1.5cm; |
||||
} |
||||
.border-b{ |
||||
border-bottom:0 |
||||
} |
||||
.print-bottom{ |
||||
margin-top: 4.5cm; |
||||
} |
||||
|
||||
} |
||||
.print-main{ |
||||
word-break: break-all; |
||||
} |
||||
.before-print{ |
||||
display: block; |
||||
} |
||||
.do-print{ |
||||
display: none; |
||||
} |
||||
.print{ |
||||
margin-top: 200px; |
||||
} |
||||
.print-btn{ |
||||
position:absolute; |
||||
right:0; |
||||
top: 15px; |
||||
} |
||||
.letter-key{ |
||||
font-weight: bold; |
||||
margin: 0 10px; |
||||
} |
||||
|
||||
.up-img-box{ |
||||
position: relative; |
||||
height: 250px; |
||||
width: 250px; |
||||
display: flex; |
||||
align-items: center; |
||||
flex-direction: column; |
||||
overflow: hidden; |
||||
.img{ |
||||
margin-top: 20px; |
||||
height: 150px; |
||||
width: 200px; |
||||
} |
||||
p{ |
||||
width: 95%; |
||||
overflow: hidden; |
||||
white-space: nowrap; |
||||
text-overflow: ellipsis; |
||||
text-align: center; |
||||
} |
||||
.checkbox{ |
||||
width: 25px; |
||||
overflow: hidden; |
||||
} |
||||
.close-img{ |
||||
position: absolute; |
||||
top:3.5%; |
||||
right: 5%; |
||||
width: 25px; |
||||
height: 25px; |
||||
background: url('../../assets/img/flowNoChecked.png') no-repeat center; |
||||
background-size: 22px; |
||||
cursor: pointer; |
||||
&:hover{ |
||||
background-size: 24px; |
||||
} |
||||
} |
||||
} |
||||
|
||||
.sorter { |
||||
// position: absolute; |
||||
// bottom: 5%; |
||||
// right: 3%; |
||||
display: flex; |
||||
justify-content: flex-end; |
||||
margin-top: 50px; |
||||
padding-bottom: 20px; |
||||
p { |
||||
color: #cccccc; |
||||
position: absolute; |
||||
left: 50%; |
||||
top: 28%; |
||||
transform: translate(-50%,-50%); |
||||
font-size: 16px; |
||||
} |
||||
} |
||||
.wrap{ |
||||
|
||||
// min-height: 664px; |
||||
min-height: 100%; |
||||
} |
||||
/deep/.el-table .cell{ |
||||
padding: 0; |
||||
} |
||||
/deep/ .el-table-column--selection .cell{ |
||||
padding-left: 0; |
||||
padding-right: 0; |
||||
} |
||||
/deep/ .el-checkbox__inner { |
||||
background: transparent; |
||||
border: 0; |
||||
background-image: url('../../assets/img/btn_per_un.png'); |
||||
background-size: cover; |
||||
width: 20px; |
||||
height: 20px; |
||||
} |
||||
/deep/ .cell .el-checkbox__input .el-checkbox__inner { |
||||
background-color: transparent; |
||||
background-image: url('../../assets/img/btn_per_un.png'); |
||||
background-size: cover; |
||||
width: 20px; |
||||
height: 20px; |
||||
border: 0; |
||||
transition: none; |
||||
} |
||||
/deep/ .el-checkbox { |
||||
width: 20px; |
||||
height: 20px; |
||||
transition: none; |
||||
} |
||||
/deep/ .el-checkbox__input.is-checked + .el-checkbox__label { |
||||
transition: none; |
||||
width: 20px; |
||||
height: 20px; |
||||
} |
||||
/deep/ .el-checkbox__input .el-checkbox__inner::after { |
||||
background: transparent; |
||||
content: ''; |
||||
height: 20px; |
||||
width: 20px; |
||||
border-radius: 50%; |
||||
transition: none; |
||||
} |
||||
|
||||
// 选中后 |
||||
|
||||
/deep/ .el-checkbox__input.is-checked .el-checkbox__inner { |
||||
background-color: transparent; |
||||
transition: none; |
||||
width: 20px; |
||||
height: 20px; |
||||
} |
||||
/deep/ .el-checkbox__input.is-checked .el-checkbox__inner::after { |
||||
content: ''; |
||||
background: transparent; |
||||
background-image: url('../../assets/img/btn_pre.png'); |
||||
|
||||
width: 20px; |
||||
border: 0; |
||||
background-size: cover; |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
transition: none; |
||||
} |
||||
/deep/ .el-table .cell { |
||||
text-align: center; |
||||
text-overflow: clip; |
||||
} |
||||
|
||||
// 分页器样式 |
||||
|
||||
/deep/ .el-pager li { |
||||
border-radius: 50% !important; |
||||
height: 30px; |
||||
width: 30px; |
||||
min-height: 25px !important; |
||||
min-width: 25px !important; |
||||
background: #f2f2f2; |
||||
line-height: 30px; |
||||
text-align: center; |
||||
padding: 0; |
||||
} |
||||
/deep/ .el-form-item { |
||||
margin-bottom: 0; |
||||
} |
||||
/deep/ .el-pagination.is-background .btn-prev { |
||||
background-color: transparent; |
||||
} |
||||
/deep/ .el-form-item__label { |
||||
color: #00b9ff; |
||||
padding: 0; |
||||
} |
||||
/deep/ .el-input__inner { |
||||
border-radius: 20px; |
||||
// background: #fafafa; |
||||
} |
||||
/deep/ .el-pagination .btn-next .el-icon { |
||||
color: #00b9ff; |
||||
font-size: 20px; |
||||
} |
||||
/deep/ .el-pagination .btn-prev .el-icon { |
||||
color: #00b9ff; |
||||
font-size: 20px; |
||||
} |
||||
|
||||
/deep/ .el-table td { |
||||
padding: 0px; |
||||
padding: 8px 0; |
||||
} |
||||
/deep/ .el-table th > .cell { |
||||
|
||||
padding: 0; |
||||
} |
||||
/deep/ .el-pagination.is-background .btn-next { |
||||
background-color: transparent; |
||||
} |
||||
/deep/ .el-input__inner { |
||||
border-radius: 20px; |
||||
height: 35px !important; |
||||
line-height: 35px; |
||||
} |
||||
</style> |
@ -0,0 +1,894 @@ |
||||
<template> |
||||
<div> |
||||
<!-- 担保函 --> |
||||
<div v-show="loans" class="mat20 bgw shadow radius10 list-box"> |
||||
<div class="flex-between search-box"> |
||||
<div class="flex-center"> |
||||
<p class="fz-16 mgr10 font-blue mgl20">流程状态</p> |
||||
<el-select v-model="processValue" clearable placeholder="请选择" @change="getProcess(1,keyWord,processValue)"> |
||||
<el-option v-for="item in processStatus" :key="item.value" :label="item.label" :value="item.value"> |
||||
</el-option> |
||||
</el-select> |
||||
</div> |
||||
<div class="mgr10 flex-center"> |
||||
<el-input class="ht40" clearable v-model="keyWord" @keyup.enter.native="getProcess(1,keyWord,processValue)" placeholder="业务编号/客户名称" ></el-input> |
||||
<el-button class="ht40 btn-pdt mgl10" type="primary" plain round @click="download">导出</el-button> |
||||
<el-button class="ht40 mgl10 btn-pdt" type="primary" round @click="getProcess(1,keyWord,processValue)">查询</el-button> |
||||
</div> |
||||
</div> |
||||
<div class="pdlr20 wrap self"> |
||||
<el-table :data="processData" stripe header-align="center" class="" @selection-change="handleSelectionChange" :row-key="getRowKeys"> |
||||
<el-table-column type="selection" width="30" align="center" :reserve-selection="true"></el-table-column> |
||||
<el-table-column type="index" width="40" label="序号" align="center"></el-table-column> |
||||
<el-table-column prop="businessCode" label="业务编号" width="100" align="center"></el-table-column> |
||||
<el-table-column prop="name" label="客户名称" align="center"></el-table-column> |
||||
<el-table-column prop="phone" label="联系电话" align="center"></el-table-column> |
||||
<el-table-column prop="businessType" label="业务类别" align="center"></el-table-column> |
||||
<el-table-column prop="loanMoney" label="担保额度(万元)" align="center"></el-table-column> |
||||
<el-table-column prop="loanTern" label="担保期限" align="center"></el-table-column> |
||||
<el-table-column prop="passingTime" label="贷审会日期" align="center"></el-table-column> |
||||
<el-table-column label="审批状态" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span :style="'color:'+scope.row.color">{{scope.row.statusText}}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="业务状态" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span :style="'color:'+scope.row.businessColor">{{ scope.row.businessText }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作状态" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span :style="'color:'+scope.row.operatingColor">{{ scope.row.operatingText }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作" width="200" align="center"> |
||||
<template slot-scope="scope"> |
||||
<el-button type="text" @click="letterData(scope.row,2)">查看</el-button> |
||||
<!-- 确认A/B角/资产部 --> |
||||
<el-button type="text" v-show="scope.row.operatingText !== '已处理'&&scope.row.businessStatus !== 3" @click="letterData(scope.row,3)">确认</el-button> |
||||
<el-button type="text" @click="auditProgressPop(scope)">审核进度</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<AuditProgress v-if="visible" :visible.sync="visible" :businessId.sync="businessId"></AuditProgress> |
||||
|
||||
|
||||
<div class="pagination sorter self"> |
||||
<p v-if="processData.length!==0">{{ pageNo }}/{{ totalPage }}页</p> |
||||
<el-pagination |
||||
:hide-on-single-page="processData.length===0" |
||||
background |
||||
:page-sizes="[10, 15, 20, 50]" |
||||
:page-size="10" |
||||
layout="total,prev,pager,next,jumper,sizes" |
||||
@current-change="currentChange" |
||||
:current-page.sync="pageNo" |
||||
:total="totals" |
||||
@size-change="handleSizeChange"> |
||||
</el-pagination> |
||||
</div> |
||||
</div> |
||||
<!-- 担保函展示 --> |
||||
<div v-if="!loans" v-loading="screenshot" ref="imageTofile"> |
||||
<!-- <img :src="jietu" alt=""> --> |
||||
<div class="shadow radius10 mgt20 pdb10"> |
||||
<div class="mga printOrder-data wd95"> |
||||
<div class="self tx-center border-b pdt20 pdb20 print-top"> |
||||
<p style="font-size:20px;font-weight: 900;">担保承诺函</p> |
||||
<!-- 仅查看时显示 --> |
||||
<el-button v-show="operationType === 2 && letterOfPrint" class="print-btn" @click="toPrint()">打印</el-button> |
||||
</div> |
||||
<div class="mgt40 pdl30 pdr30 print-text"> |
||||
<strong style="font-size:18px">{{letterValue.bank}} :</strong> |
||||
<!-- 生成/确定 担保函的文字--处于非放款通知的情况下 --> |
||||
<div> |
||||
<p v-show="operationType !== 2" class="fz-20 mgt20" style="line-height:40px"> |
||||
根据<span class="letter-key">{{letterValue.name}}</span>的贷款担保申请, 经我公司项目贷审会研究, 同意为其在贵行申请的贷款提供担保, 特向贵行提供承诺。 本承诺系我公司同意与贵行签订保证合同的意向, 一切权利义务以保证合同为准! |
||||
</p> |
||||
<!-- 查看担保函的文字 --> |
||||
<p v-show="operationType === 2" class="mgt20" style="line-height:40px;font-size:18px"> |
||||
根据<span class="letter-key">{{letterValue.name}}</span>的贷款担保申请, 经我公司<span class="letter-key">{{letterValue.passingTime}}</span>项目贷审会研究, 同意为其在贵行申请的贷款提供<span class="letter-key">{{letterValue.loanMoney}}</span>万元 担保,期限<span class="letter-key">{{letterValue.loanTern}}</span>, 特向贵行提供承诺。 本承诺系我公司同意与贵行签订保证合同的意向, 一切权利义务以保证合同为准! |
||||
</p> |
||||
</div> |
||||
<!-- 生成担保函时展示 --> |
||||
<div class="mgl40 mgt20" v-show="operationType !== 2"> |
||||
<div class="df"> |
||||
<p class="fz-16 guarantee-Text-wd not-zoom">客户名称:</p> |
||||
<p class="fz-16">{{letterValue.name}}</p> |
||||
</div> |
||||
<div class="df mgt10"> |
||||
<p class="fz-16 guarantee-Text-wd not-zoom">贷审会日期:</p> |
||||
<p class="fz-16">{{letterValue.passingTime}}</p> |
||||
</div> |
||||
<div class="df mgt10"> |
||||
<p class="fz-16 guarantee-Text-wd not-zoom">担保金额(万元):</p> |
||||
<p class="fz-16" v-text="`${letterValue.loanMoney} (大写:${letterValue.guaranteeMoney})`"></p> |
||||
</div> |
||||
<div class="df mgt10"> |
||||
<p class="fz-16 guarantee-Text-wd not-zoom">担保期限:</p> |
||||
<p class="fz-16">{{letterValue.loanTern}}</p> |
||||
</div> |
||||
</div> |
||||
<div class="wd100 flex-end-content mgb20" :class="operationType === 2 ? 'print' : ''"> |
||||
<div class="mgr50 print-bottom" style="font-size:18px"> |
||||
<strong>大庆市工商业融资担保有限公司</strong> |
||||
<div class="mgl40 mgt10"> |
||||
<p>法定代表人:</p> |
||||
<p class="mgt10">或授权代理人:</p> |
||||
<p class="mgt10 ">  年   月   日</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<!-- 查看时的按钮 --> |
||||
<div class="fj-center"> |
||||
<el-button v-show="operationType === 2" type="primary bd0" class="mgt20" round @click="downloadLetter">导出</el-button> |
||||
</div> |
||||
<div> |
||||
<div class="mgt20 left-border fz-16"><p class="c-black mgl10">附件</p></div> |
||||
<div class="shadow radius10 mgt20 pdr20 flex-center"> |
||||
<div v-for="(item,index) in fileList" :key="index" class="mgr20 mgt20 mab20"> |
||||
<span class="fz-16 mgl20 cur" @click="preview(item)">{{`附件${index+1}`}}</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<!-- 上传图片 --> |
||||
<div class="df mat20"> |
||||
<div v-show="operationType !== 2 && isFgJl !== 1" class="df flex-align-center mgr30"> |
||||
<div class="mgr30 df mgl30"> |
||||
<!-- <span class="c-red">*</span> --> |
||||
<!-- 查看/确认切换 --> |
||||
<p class="fz-14 font-blue">上传银行回单</p> |
||||
</div> |
||||
<el-upload |
||||
v-show="operationType !== 2 && isFgJl !== 1" |
||||
multiple |
||||
class="flex-align-center" |
||||
ref="file-imgup" |
||||
:action="uploadUrl" |
||||
:on-success="upImgFile" |
||||
:file-list="imgFileList" |
||||
:headers="uploadHeaders" |
||||
:show-file-list="false" |
||||
:on-preview="handlePreview" |
||||
> |
||||
<el-button slot="trigger" size="small" type="primary" class="mgr20" >新增图片</el-button> |
||||
</el-upload> |
||||
</div> |
||||
<el-button slot="trigger" size="small" type="warning" class="mgl40" @click="deleteImgs" v-show="operationType !== 2 && isFgJl !== 1">批量删除</el-button> |
||||
</div> |
||||
<div class="df mgb20"> |
||||
<!-- 图片展示 --> |
||||
<el-checkbox-group class="df" style="flex-wrap:wrap" v-model="checkImgList" @change="imgCheckbox"> |
||||
<div class="mgl30 mgt20 up-img-box shadow radius10" v-for="(item,index) in imgListT" :key="index" v-show="item"> |
||||
<img class="img mgt10" :src="item.url" @click="seeImg(item.url)"> |
||||
<!-- <p class="fz-14 mgt10">{{item.name}}</p> --> |
||||
<div class="checkbox mgt10" v-show="operationType !== 2"> |
||||
<el-checkbox :label="index"></el-checkbox> |
||||
</div> |
||||
<!-- 可能需要在查看的状态下隐藏 --> |
||||
<div v-show="operationType !== 2 && isFgJl !== 1" class="close-img" @click="delImgOne(index)"></div> |
||||
</div> |
||||
</el-checkbox-group> |
||||
</div> |
||||
<!-- 担保函--确认 --> |
||||
<div v-show="operationType !== 2"> |
||||
<div v-show="operationType === 1" class="mgt20 left-border fz-16"><p class="c-black mgl10">审核</p></div> |
||||
<div v-show="operationType === 3" class="mgt20 left-border fz-16"><p class="c-black mgl10">财务确认</p></div> |
||||
<div class="shadow radius10 mgt20 mgb20 pdr20"> |
||||
<el-form label-position="right" label-width="80px" class="mgr20 mgt20 mab20"> |
||||
<el-form-item label="审核意见"> |
||||
<el-input |
||||
class="mgl20 wd100" |
||||
type="textarea" |
||||
:rows="3" |
||||
placeholder="请输入审核意见" |
||||
v-model="letterValue.auditOpinion"> |
||||
</el-input> |
||||
</el-form-item> |
||||
</el-form> |
||||
</div> |
||||
</div> |
||||
|
||||
<!-- 当前页面预览弹框 --> |
||||
<el-dialog :visible.sync="showPreviewImg" style="margin-top:-7vh"> |
||||
<div class=" tx-center"> |
||||
<img :src="previewImg" class="el-image-viewer__img" style="transform: scale(1) rotate(0deg);margin-top: -1px; max-height: 100%; max-width: 100%;"> |
||||
</div> |
||||
</el-dialog> |
||||
<!-- 预览pdf --> |
||||
<pdf :visible.sync="pdfVisible" :src.sync="pdfSrc"></pdf> |
||||
<!-- 确认按钮 --> |
||||
<div class="df fj-end mgt30 mgb30"> |
||||
<!-- <el-button class="mgr20" v-if="sendShow" @click="toImage($refs.imageTofile)">抄送</el-button> --> |
||||
|
||||
<div class="df" v-show="operationType === 3"> |
||||
<el-button plain type="primary" class="mgr20" round @click="backTo">返回</el-button> |
||||
<el-button type="success" class="mgr20" v-preventReClick round @click="sumbitOpinion('提交',2)">提交</el-button> |
||||
<el-button type="warning" class="mgr20" v-preventReClick round @click="sumbitOpinion('驳回',4)">驳回</el-button> |
||||
</div> |
||||
</div> |
||||
<!-- 审核流程和业务流程 --> |
||||
<processTemp></processTemp> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { paymentDetail,paymentList, excelExportPayment, updatePayment, exportGuaranteeLetter ,copySend ,designFrom} from '../../utils/api' |
||||
import axios from 'axios'; |
||||
|
||||
import core from '../../utils/core' |
||||
|
||||
// var myToken = sessionStorage.getItem('token') |
||||
export default { |
||||
data() { |
||||
return { |
||||
uploadUrl:axios.defaults.baseURL +'/api-guarantee/dg-apply-amount-info/uploadFile', |
||||
loans: true, |
||||
//流程状态 |
||||
processValue: '', |
||||
processStatus: [{ |
||||
label: '审核中', |
||||
value: 1 |
||||
}, |
||||
{ |
||||
label: '已审核', |
||||
value: 2 |
||||
}, |
||||
{ |
||||
label: '已驳回', |
||||
value: 4 |
||||
}], |
||||
keyWord: '',//搜索框 |
||||
pageNo: 1, |
||||
pageNum: 10, |
||||
totals: 1, |
||||
totalPage: 1, |
||||
|
||||
processData: [],//列表数据 |
||||
multipleSelection: [],//选择的数据 |
||||
guaranteeMoney: '',//担保金额 |
||||
//担保函数据 |
||||
letterValue: { |
||||
businessId: '',//业务id |
||||
bank: '',//银行 |
||||
name: '',//客户名称 |
||||
passingTime: '',//贷审会日期 |
||||
loanMoney: '',//担保金额 |
||||
guaranteeMoney: '',//担保金额转格式 |
||||
file: '',//会议纪要 |
||||
loanTern: '',//担保期限 |
||||
auditOpinion: '',//审核意见 |
||||
imgFile: '' //图片列表 |
||||
}, |
||||
operationType: 1,//列表操作状态 |
||||
letterOfPrint: true,//打印按钮的显隐 |
||||
printWidth: false,//打印时改变打印内容宽度 |
||||
imgFileList: [], |
||||
imgListT: [], |
||||
checkImgList:[], |
||||
inspectionPhotos: [], //图片列表 |
||||
uploadHeaders:{},//上传带token |
||||
isFgJl: '', |
||||
fileList: [],//附件文件列表 |
||||
showPreviewImg: false,//图片预览 |
||||
previewImg:'',//查看预览文件 |
||||
pdfVisible: false,//pdf弹框 |
||||
pdfSrc: '',//pdf文件 |
||||
visible:false, |
||||
businessId:'', |
||||
fromData:[],// 表单值 |
||||
upDataArr:[],// 表单限制文件 |
||||
screenshot:false,//截图时的加载 |
||||
jietu:'', |
||||
sendShow:false |
||||
|
||||
}; |
||||
}, |
||||
created(){ |
||||
this.uploadHeaders = {token:sessionStorage.getItem('token')} |
||||
}, |
||||
mounted(){ |
||||
// 判断是否由待处理哪里跳转过来的,每次触发后删除 |
||||
if(sessionStorage.getItem('decideJump')){ |
||||
let data = JSON.parse(sessionStorage.getItem('decideJump')) |
||||
data.id = data.detailId |
||||
data.status = data.approveStatus |
||||
data.handleStatus = data.operatingStatus |
||||
// 判断操作 |
||||
this.loans = false //判断详情显示 |
||||
if(data.btn==='确认'){ |
||||
this.operationType = 3 |
||||
this.paymentDetail(data)// 取得详情 |
||||
this.operationType = operationType //列表操作状态 |
||||
this.isFgJl = data.isFgJl //是否是法规部经理 |
||||
|
||||
this.$store.commit("isFgJlData", { isFgJl: data.isFgJl }); |
||||
this.$store.commit("loansData", { loans: this.loans }); |
||||
this.$store.commit("letterData", { operationType: this.operationType, letterValue: this.letterValue }); |
||||
} |
||||
sessionStorage.removeItem('decideJump') |
||||
// 读取抄送状态,当前是否处于抄送查看, |
||||
}else if(sessionStorage.getItem('fromCopyTo')){ |
||||
let data = JSON.parse(sessionStorage.getItem('fromCopyTo')) |
||||
this.loans = false // 进入详情 |
||||
this.operationType = 2 |
||||
// 判断是否来自个人效率非抄送列表 |
||||
if(sessionStorage.getItem('private')==='查看'){ |
||||
this.paymentDetail(data) |
||||
}else{ |
||||
let that = this |
||||
this.letterValue = { |
||||
businessId: data.businessId,//业务id |
||||
bank: data.bank,//银行 |
||||
name: data.clientName,//客户名称 |
||||
passingTime: data.passingTime,//贷审会日期 |
||||
loanMoney: data.loanMoney,//担保金额 |
||||
guaranteeMoney: that.core.fMoney3(data.loanMoney),//担保金额转格式 |
||||
file: '',//会议纪要 |
||||
loanTern: data.loanTern,//担保期限 |
||||
auditOpinion: '',//审核意见 |
||||
roleId: ''//角色id |
||||
} |
||||
} |
||||
// this.disable = true// 禁用表单 |
||||
// this.messageDetail(data.detailId) |
||||
}else{ |
||||
// 读取列表的显示状态 |
||||
this.loans = this.$store.state.guarantee.loans |
||||
this.operationType = this.$store.state.guarantee.operationType |
||||
this.letterValue = this.$store.state.guarantee.letterValue |
||||
this.isFgJl = this.$store.state.guarantee.isFgJl |
||||
if(this.$store.state.guarantee.imgListT){ |
||||
this.imgListT = this.$store.state.guarantee.imgListT |
||||
} |
||||
if(this.$store.state.guarantee.fileList){ |
||||
this.fileList = this.$store.state.guarantee.fileList |
||||
} |
||||
this.getProcess(this.pageNo,this.keyWord,this.processValue) |
||||
} |
||||
|
||||
|
||||
}, |
||||
watch:{ |
||||
loans:function(val){ |
||||
if(val){ |
||||
this.getProcess(this.pageNo,this.keyWord,this.processValue) |
||||
}else{ |
||||
// this.designFrom()// 动态表单 |
||||
} |
||||
this.$store.commit("loansData", { loans: this.loans }); |
||||
}, |
||||
|
||||
}, |
||||
methods: { |
||||
// 详情接口--个人效率专用 |
||||
paymentDetail(data){ |
||||
paymentDetail({id:data.detailId}).then(res=>{ |
||||
let that = this,data = res.data.data |
||||
this.letterValue = { |
||||
businessId: data.businessId,//业务id |
||||
bank: data.bank,//银行 |
||||
name: data.clientName,//客户名称 |
||||
passingTime: data.passingTime,//贷审会日期 |
||||
loanMoney: data.loanMoney,//担保金额 |
||||
guaranteeMoney: that.core.fMoney3(data.loanMoney),//担保金额转格式 |
||||
file: '',//会议纪要 |
||||
loanTern: data.loanTern,//担保期限 |
||||
auditOpinion: '',//审核意见 |
||||
roleId: ''//角色id |
||||
} |
||||
if(data.imgFile){ |
||||
let newArr = data.imgFile.split(",") |
||||
let arrList = []; |
||||
newArr.map(e =>{ |
||||
let j = {}; |
||||
j.url = e |
||||
arrList.push(j); |
||||
}) |
||||
this.imgListT = arrList |
||||
}else{ |
||||
this.imgListT = [] |
||||
} |
||||
if(data.file) {this.fileList = data.file.split(",") }else{this.fileList = []} |
||||
|
||||
|
||||
this.$store.commit("fileData", { fileList: this.fileList }); |
||||
this.$store.commit("imgListTData", { imgListT: this.imgListT }); |
||||
}) |
||||
}, |
||||
// 担保函-列表 |
||||
async getProcess(val, search, status){ |
||||
let params = { |
||||
page: val, |
||||
size: this.pageNum, |
||||
customerNumberOrName: search, |
||||
status: status |
||||
} |
||||
let res = await paymentList(params) |
||||
res.data.list.map(e =>{ |
||||
e.statusText = this.core.auditStatus(e.status).text |
||||
e.color = this.core.auditStatus(e.status).color |
||||
e.businessText = this.core.businessType(e.businessStatus).text |
||||
e.businessColor = this.core.businessType(e.businessStatus).color |
||||
e.operatingText = this.core.operationType(e.operatingStatus).text |
||||
e.operatingColor = this.core.operationType(e.operatingStatus).color |
||||
}) |
||||
this.processData = res.data.list |
||||
// this.processData = [{name:1}] |
||||
this.totals = res.data.totalCount |
||||
if(res.data.totalPage !== 0 ){ |
||||
this.totalPage = res.data.totalPage |
||||
} |
||||
|
||||
}, |
||||
handleSizeChange(val) { |
||||
this.pageNum = val |
||||
this.getProcess(1) |
||||
}, |
||||
//列表数据导出 |
||||
download(){ |
||||
// if(this.multipleSelection.length == 0){ |
||||
// this.$message.error('请先选择财务确认数据!'); |
||||
// }else{ |
||||
let id = sessionStorage.getItem('userID') |
||||
let str = this.multipleSelection.map(e => e.id) |
||||
let downloadElement = document.createElement('a'); |
||||
downloadElement.href = `${excelExportPayment}?ids=${str?str:[]}&userId=`+id; |
||||
downloadElement.download = '业务申请导出文件'; //下载后文件名 |
||||
document.body.appendChild(downloadElement); |
||||
downloadElement.click(); //点击下载 |
||||
document.body.removeChild(downloadElement); //下载完成移除元素 |
||||
// } |
||||
}, |
||||
downloadLetter(){ |
||||
window.open(`${exportGuaranteeLetter}?businessId=${this.letterValue.businessId}&roleId=68`) |
||||
}, |
||||
getRowKeys(row) { |
||||
return row.Id; |
||||
}, |
||||
handleSelectionChange(val) { |
||||
this.multipleSelection = val; |
||||
}, |
||||
currentChange(val){ |
||||
this.getProcess(val) |
||||
// this.page = +val; |
||||
}, |
||||
//列表操作-详情 |
||||
letterData(row,operationType){ |
||||
this.loans = false //判断详情显示 |
||||
this.operationType = operationType //列表操作状态 |
||||
this.isFgJl = row.isFgJl //是否是法规部经理 |
||||
//担保函数据 |
||||
this.letterValue = { |
||||
businessId: row.businessId,//业务id |
||||
bank: row.bank,//银行 |
||||
name: row.name,//客户名称 |
||||
passingTime: row.passingTime,//贷审会日期 |
||||
loanMoney: this.core.fMoney(row.loanMoney),//担保金额 |
||||
guaranteeMoney : this.core.fMoney3(row.loanMoney),//担保金额转格式 |
||||
file: row.file,//会议纪要 |
||||
loanTern: row.loanTern,//担保期限 |
||||
auditOpinion: row.auditOpinion,//审核意见 |
||||
imgFile: row.imgFile, //图片列表 |
||||
isFgJl: row.isFgJl |
||||
} |
||||
if(row.imgFile){ |
||||
let newArr = row.imgFile.split(",") |
||||
let arrList = []; |
||||
newArr.map(e =>{ |
||||
let j = {}; |
||||
j.url = e |
||||
arrList.push(j); |
||||
}) |
||||
this.imgListT = arrList |
||||
}else{ |
||||
this.imgListT = [] |
||||
} |
||||
if(row.file) {this.fileList = row.file.split(",") }else{this.fileList = []} |
||||
|
||||
|
||||
this.$store.commit("fileData", { fileList: this.fileList }); |
||||
this.$store.commit("imgListTData", { imgListT: this.imgListT }); |
||||
this.$store.commit("isFgJlData", { isFgJl: row.isFgJl }); |
||||
this.$store.commit("loansData", { loans: this.loans }); |
||||
this.$store.commit("letterData", { operationType: this.operationType, letterValue: this.letterValue }); |
||||
}, |
||||
// 预览文件item |
||||
preview(item){ |
||||
let len = item.length,type = item.substring(len-4,len) |
||||
// 检查后四位,进行格式匹配 |
||||
if(['.jpg','jpeg','.png','.gif','.svg','.psd'].includes(type.toLowerCase())){ |
||||
this.showPreviewImg = true |
||||
this.previewImg = item |
||||
}else if(['.pdf'].includes(type.toLowerCase())){ |
||||
this.pdfVisible = true,//pdf弹框 |
||||
this.pdfSrc = item //pdf文件 |
||||
}else if('.mp4'.includes(type.toLowerCase())){ |
||||
core.downMp4(url,this.URLsubstring(url)) |
||||
} |
||||
else{ |
||||
window.open(`https://view.officeapps.live.com/op/view.aspx?src=${item}`) |
||||
} |
||||
}, |
||||
// 打印功能 |
||||
toPrint(){ |
||||
this.letterOfPrint = false |
||||
this.printWidth = true |
||||
this.$nextTick(()=>{ |
||||
if(this.letterOfPrint === false){ |
||||
var oldstr = document.body.innerHTML |
||||
// 截取需要打印的部分 |
||||
var newstr = document.getElementsByClassName('printOrder-data')[0].innerHTML |
||||
document.body.innerHTML = newstr // 打印区域赋值给body |
||||
window.print();//调用打印 |
||||
// 还原:将旧的页面储存起来,当打印完成后返给给页面。 |
||||
document.body.innerHTML = oldstr |
||||
window.location.reload() |
||||
} |
||||
}) |
||||
}, |
||||
// 提交审核意见 |
||||
sumbitOpinion(text,type){ |
||||
this.$confirm(`确定要${text}该审核意见吗?`, '提示', { |
||||
type: 'warning' |
||||
}).then(() => { |
||||
if(type == 4 && this.letterValue.auditOpinion == ''){ |
||||
return this.$message.error("请先填写审核意见!") |
||||
} |
||||
let imgFile = this.imgListT.map(e =>e.url).join() |
||||
let params = { |
||||
auditOpinion: this.letterValue.auditOpinion, |
||||
businessId: this.letterValue.businessId, |
||||
status: type, |
||||
imgFile: imgFile |
||||
} |
||||
updatePayment(params).then(res => { |
||||
this.$message.success(`${text}成功`); |
||||
let btnPermissionsStr = sessionStorage.getItem("now-roleBtn").split(','); |
||||
if(btnPermissionsStr.includes('68')){ |
||||
// if(type===2){ |
||||
// this.toImage(this.$refs.imageTofile) |
||||
// }else{ |
||||
this.loans = true |
||||
// } |
||||
}else{ |
||||
this.loans = true |
||||
} |
||||
}).catch(res => {}); |
||||
}).catch(() => {}); |
||||
}, |
||||
// 返回 |
||||
backTo(){ |
||||
this.loans = true |
||||
}, |
||||
// 担保-调查-图片上传成功钩子 |
||||
upImgFile(response, file, filelist){ |
||||
let arr = [] |
||||
this.imgListT = this.$store.state.guarantee.imgListT |
||||
if(response.success){ |
||||
this.inspectionPhotos.push(response.data) |
||||
let otherList =JSON.parse(JSON.stringify(response.data)) |
||||
arr.push({name:file.name,url:otherList}) |
||||
} |
||||
this.imgListT.push(arr[0]) //展示用 |
||||
}, |
||||
// 图片批量删除功能---担保部--附件 |
||||
deleteImgs(){ |
||||
let len = this.checkImgList.length |
||||
this.checkImgList.sort(function(a, b){return a - b}) |
||||
if(len > 0){ |
||||
for(let i=len-1;i>=0;i--){ |
||||
this.imgListT.splice(this.checkImgList[i],1) |
||||
this.inspectionPhotos.splice(this.checkImgList[i],1) |
||||
} |
||||
this.checkImgList=[] |
||||
}else{ |
||||
this.$message.error("请先选中图片") |
||||
} |
||||
}, |
||||
imgCheckbox(){ |
||||
}, |
||||
// 点击图片进行预览 |
||||
seeImg(url){ |
||||
let len = url.length,type = url.substring(len-4,len) |
||||
// 检查后四位,进行格式匹配 |
||||
if(['.jpg','jpeg','.png','.gif','.svg','.psd'].includes(type.toLowerCase())){ |
||||
this.showPreviewImg = true |
||||
this.previewImg = url |
||||
}else{ |
||||
window.open('https://view.officeapps.live.com/op/view.aspx?src='+url) |
||||
} |
||||
}, |
||||
// 图片删除-x图标--担保部删除图片 |
||||
delImgOne(index){ |
||||
this.checkImgList = [] |
||||
this.imgListT.splice(index,1) |
||||
if(this.inspectionPhotos){ |
||||
this.inspectionPhotos.splice(index,1) |
||||
} |
||||
}, |
||||
auditProgressPop(data){ |
||||
this.visible=true |
||||
this.businessId = data.row.businessId |
||||
}, |
||||
// 页面元素转图片 |
||||
toImage(el) { |
||||
copySend({ |
||||
businessId:this.letterValue.businessId, |
||||
detailId:this.letterValue.id, |
||||
processId:9 |
||||
}).then(res=>{ |
||||
if(res.code===10000){ |
||||
this.loans = true |
||||
this.screenshot = false |
||||
} |
||||
}).catch(err=>{ |
||||
this.screenshot = false |
||||
}) |
||||
}, |
||||
compare(key){ // 用于对象数组排序 |
||||
return function(value1,value2){ |
||||
let val1=value1[key]; |
||||
let val2=value2[key]; |
||||
return val1-val2; |
||||
} |
||||
}, |
||||
designFrom(){// 表单数据接口 |
||||
designFrom({processId:9}).then(res=>{ |
||||
this.fromData = res.data |
||||
this.fromData.sort(this.compare('id')) |
||||
// this.upDataArr = [] |
||||
// this.upDataArr.push(this.fromData[24].ifRequired,this.fromData[25].ifRequired,this.fromData[26].ifRequired,this.fromData[27].ifRequired,this.fromData[28].ifRequired,this.fromData[29].ifRequired,this.fromData[30].ifRequired,this.fromData[31].ifRequired,this.fromData[32].ifRequired ) |
||||
}) |
||||
}, |
||||
// 上传后点击预览文件钩子 |
||||
handlePreview(file) { |
||||
if(['image/jpg','image/jpeg','image/png','image/gif','image/svg','image/psd'].includes(file.raw.type)){ |
||||
this.showPreviewImg = true |
||||
this.previewImg=file.response.data[0] |
||||
// pdf调用插件 |
||||
}else if(file.raw.type==="application/pdf"){ |
||||
window.open(file.response.data[0]) |
||||
}else if(file.raw.type==='video/mp4'){ |
||||
core.downMp4(file.response.data[0],this.URLsubstring(file.response.data[0])) |
||||
} |
||||
else{ |
||||
window.open('https://view.officeapps.live.com/op/view.aspx?src='+file.response.data[0]) |
||||
} |
||||
}, |
||||
URLsubstring(url){// 剪切img-url的名称 |
||||
if(url){ |
||||
return url.substring(59,url.length) |
||||
} |
||||
}, |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
@page{//清除打印时的页眉页脚--通过margin挤掉 |
||||
size: auto A4 landscape;//设置打印规定的纸张大小 |
||||
margin: 3mm 1cm 3mm; |
||||
} |
||||
@media print { |
||||
.print-top{ |
||||
padding-top: 3.5cm; |
||||
padding-bottom: 1cm; |
||||
} |
||||
.print-text{ |
||||
padding-top: .5cm; |
||||
margin-left: 1.5cm; |
||||
margin-right: 1.5cm; |
||||
} |
||||
.border-b{ |
||||
border-bottom:0 |
||||
} |
||||
.print-bottom{ |
||||
margin-top: 4.5cm; |
||||
} |
||||
} |
||||
.print{ |
||||
margin-top: 200px; |
||||
} |
||||
.print-btn{ |
||||
position:absolute; |
||||
right:0; |
||||
top: 15px; |
||||
} |
||||
.letter-key{ |
||||
font-weight: bold; |
||||
margin: 0 10px; |
||||
} |
||||
.guarantee-Text-wd{ |
||||
width: 180px; |
||||
} |
||||
|
||||
.up-img-box{ |
||||
position: relative; |
||||
height: 250px; |
||||
width: 250px; |
||||
display: flex; |
||||
align-items: center; |
||||
flex-direction: column; |
||||
overflow: hidden; |
||||
.img{ |
||||
margin-top: 20px; |
||||
height: 150px; |
||||
width: 200px; |
||||
} |
||||
p{ |
||||
width: 95%; |
||||
overflow: hidden; |
||||
white-space: nowrap; |
||||
text-overflow: ellipsis; |
||||
text-align: center; |
||||
} |
||||
.checkbox{ |
||||
width: 25px; |
||||
overflow: hidden; |
||||
} |
||||
.close-img{ |
||||
position: absolute; |
||||
top:3.5%; |
||||
right: 5%; |
||||
width: 25px; |
||||
height: 25px; |
||||
background: url('../../assets/img/flowNoChecked.png') no-repeat center; |
||||
background-size: 22px; |
||||
cursor: pointer; |
||||
&:hover{ |
||||
background-size: 24px; |
||||
} |
||||
} |
||||
} |
||||
|
||||
.sorter { |
||||
// position: absolute; |
||||
// bottom: 5%; |
||||
// right: 3%; |
||||
display: flex; |
||||
justify-content: flex-end; |
||||
margin-top: 50px; |
||||
padding-bottom: 20px; |
||||
p { |
||||
color: #cccccc; |
||||
position: absolute; |
||||
left: 50%; |
||||
top: 28%; |
||||
transform: translate(-50%,-50%); |
||||
font-size: 16px; |
||||
} |
||||
} |
||||
.wrap{ |
||||
|
||||
// min-height: 664px; |
||||
min-height: 100%; |
||||
} |
||||
/deep/.el-table .cell{ |
||||
padding: 0; |
||||
} |
||||
/deep/ .el-table-column--selection .cell{ |
||||
padding-left: 0; |
||||
padding-right: 0; |
||||
} |
||||
/deep/ .el-checkbox__inner { |
||||
background: transparent; |
||||
border: 0; |
||||
background-image: url('../../assets/img/btn_per_un.png'); |
||||
background-size: cover; |
||||
width: 20px; |
||||
height: 20px; |
||||
} |
||||
/deep/ .cell .el-checkbox__input .el-checkbox__inner { |
||||
background-color: transparent; |
||||
background-image: url('../../assets/img/btn_per_un.png'); |
||||
background-size: cover; |
||||
width: 20px; |
||||
height: 20px; |
||||
border: 0; |
||||
transition: none; |
||||
} |
||||
/deep/ .el-checkbox { |
||||
width: 20px; |
||||
height: 20px; |
||||
transition: none; |
||||
} |
||||
/deep/ .el-checkbox__input.is-checked + .el-checkbox__label { |
||||
transition: none; |
||||
width: 20px; |
||||
height: 20px; |
||||
} |
||||
/deep/ .el-checkbox__input .el-checkbox__inner::after { |
||||
background: transparent; |
||||
content: ''; |
||||
height: 20px; |
||||
width: 20px; |
||||
border-radius: 50%; |
||||
transition: none; |
||||
} |
||||
|
||||
// 选中后 |
||||
|
||||
/deep/ .el-checkbox__input.is-checked .el-checkbox__inner { |
||||
background-color: transparent; |
||||
transition: none; |
||||
width: 20px; |
||||
height: 20px; |
||||
} |
||||
/deep/ .el-checkbox__input.is-checked .el-checkbox__inner::after { |
||||
content: ''; |
||||
background: transparent; |
||||
background-image: url('../../assets/img/btn_pre.png'); |
||||
|
||||
width: 20px; |
||||
border: 0; |
||||
background-size: cover; |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
transition: none; |
||||
} |
||||
/deep/ .el-table .cell { |
||||
text-align: center; |
||||
text-overflow: clip; |
||||
} |
||||
|
||||
// 分页器样式 |
||||
|
||||
/deep/ .el-pager li { |
||||
border-radius: 50% !important; |
||||
height: 30px; |
||||
width: 30px; |
||||
min-height: 25px !important; |
||||
min-width: 25px !important; |
||||
background: #f2f2f2; |
||||
line-height: 30px; |
||||
text-align: center; |
||||
padding: 0; |
||||
} |
||||
/deep/ .el-form-item { |
||||
margin-bottom: 0; |
||||
} |
||||
/deep/ .el-pagination.is-background .btn-prev { |
||||
background-color: transparent; |
||||
} |
||||
/deep/ .el-form-item__label { |
||||
color: #00b9ff; |
||||
padding: 0; |
||||
} |
||||
/deep/ .el-input__inner { |
||||
border-radius: 20px; |
||||
// background: #fafafa; |
||||
} |
||||
/deep/ .el-pagination .btn-next .el-icon { |
||||
color: #00b9ff; |
||||
font-size: 20px; |
||||
} |
||||
/deep/ .el-pagination .btn-prev .el-icon { |
||||
color: #00b9ff; |
||||
font-size: 20px; |
||||
} |
||||
|
||||
/deep/ .el-table td { |
||||
padding: 0px; |
||||
padding: 8px 0; |
||||
} |
||||
/deep/ .el-table th > .cell { |
||||
|
||||
padding: 0; |
||||
} |
||||
/deep/ .el-pagination.is-background .btn-next { |
||||
background-color: transparent; |
||||
} |
||||
/deep/ .el-input__inner { |
||||
border-radius: 20px; |
||||
height: 35px !important; |
||||
line-height: 35px; |
||||
} |
||||
</style> |
@ -0,0 +1,146 @@ |
||||
<template> |
||||
<div> |
||||
<div class="radius10 shadow main"> |
||||
<div class="flex-between mgt20 mgb20 mglr10"> |
||||
<div class="df-ac"> |
||||
<p class="fz-16 mgr10 font-blue not-zoom">添加时间</p> |
||||
<el-date-picker |
||||
v-model="searchForm.date" |
||||
align="right" |
||||
unlink-panels |
||||
type="daterange" |
||||
start-placeholder="开始日期" |
||||
end-placeholder="结束日期" |
||||
format="yyyy-MM-dd" |
||||
value-format="yyyy-MM-dd" |
||||
@change="selectTime" |
||||
clearable |
||||
> |
||||
</el-date-picker> |
||||
</div> |
||||
<div class="flex-center"> |
||||
<el-input placeholder="搜索员工姓名/员工工号" class="cusSearch" v-model="searchForm.keyword" clearable></el-input> |
||||
<el-button type="primary" round @click="search">查询</el-button> |
||||
</div> |
||||
</div> |
||||
<Background-list :check="false" :nowPage="pageNo" :totalPage="totalPage" :tableData="logData" @getPaging="currentChange" :totalCount="totalCount" @getSize="getSize"> |
||||
<template v-slot:tableData> |
||||
<el-table-column prop="empName" label="姓名" align="center"></el-table-column> |
||||
<el-table-column prop="jobNumber" label="工号" align="center"></el-table-column> |
||||
<el-table-column label="所属部门" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span class="ellipsis">{{ scope.row.deptName }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column prop="posName" label="职位" align="center"></el-table-column> |
||||
<el-table-column prop="phone" label="联系电话" align="center"></el-table-column> |
||||
<el-table-column prop="createTime" label="添加日期" min-width="120" align="center"></el-table-column> |
||||
<el-table-column prop="loginNum" label="登录次数" align="center"></el-table-column> |
||||
<el-table-column prop="newestTime" label="最后登录时间" min-width="120" align="center"></el-table-column> |
||||
</template> |
||||
</Background-list> |
||||
<!-- <el-table :data="logData" class="mat20" stripe header-align="center" :row-key="getRowKeys"> |
||||
<el-table-column type="index" width="100" label="序号" align="center"></el-table-column> |
||||
<el-table-column prop="empName" label="姓名" align="center"></el-table-column> |
||||
<el-table-column prop="jobNumber" label="工号" align="center"></el-table-column> |
||||
<el-table-column label="所属部门" align="center"> |
||||
<template slot-scope="scope"> |
||||
<span class="ellipsis">{{scope.row.deptName}}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column prop="posName" label="职位" align="center"></el-table-column> |
||||
<el-table-column prop="phone" label="联系电话" align="center"></el-table-column> |
||||
<el-table-column prop="createTime" label="添加日期" align="center"></el-table-column> |
||||
<el-table-column prop="loginNum" label="登录次数" align="center"></el-table-column> |
||||
<el-table-column prop="newestTime" label="最后登录时间" align="center"></el-table-column> |
||||
</el-table> |
||||
<div class="pagination"> |
||||
<p class="pagination_pageNumber">{{`${pageNo}/${totalPage}页`}}</p> |
||||
<el-pagination background @current-change="currentChange" :current-page="pageNo" layout="total, prev, pager, next" :total="totals"> |
||||
</el-pagination> |
||||
</div> --> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { loginLogList } from '../../utils/api'; |
||||
export default { |
||||
data() { |
||||
return { |
||||
searchForm: { |
||||
date: '', |
||||
startTime: '', |
||||
endTime: '', |
||||
keyword: '' |
||||
}, |
||||
logData: [], |
||||
pageNo: 1, |
||||
pageNumber: 10, |
||||
totals: 1, |
||||
totalPage: 1, |
||||
totalCount:10 |
||||
}; |
||||
}, |
||||
mounted() { |
||||
this.getData(); |
||||
}, |
||||
methods: { |
||||
// 查询平台日志列表 |
||||
async getData() { |
||||
let res = await loginLogList({ |
||||
page: this.pageNo, |
||||
size: this.pageNumber, |
||||
startTime: this.searchForm.startTime, |
||||
endTime: this.searchForm.endTime, |
||||
jobNumberOrName: this.searchForm.keyword |
||||
}); |
||||
this.logData = res.data.list; |
||||
this.totals = res.data.totalCount; |
||||
this.totalPage = res.data.totalPage; |
||||
this.totalCount = res.data.totalCount |
||||
}, |
||||
getSize(val){ |
||||
this.pageNo=1 |
||||
this.pageNumber=val |
||||
this.getData() |
||||
}, |
||||
getRowKeys(row) { |
||||
return row.id; |
||||
}, |
||||
currentChange(val) { |
||||
this.pageNo = val; |
||||
this.getData(); |
||||
}, |
||||
// 选择时间 |
||||
selectTime(val) { |
||||
if (val) { |
||||
this.searchForm.startTime = val[0]; |
||||
this.searchForm.endTime = val[1]; |
||||
} else { |
||||
this.searchForm.startTime = ''; |
||||
this.searchForm.endTime = ''; |
||||
} |
||||
}, |
||||
search() { |
||||
this.pageNo = 1; |
||||
this.getData(); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
@import url('../../assets/css/common.scss'); |
||||
.cusSearch { |
||||
margin-right: 16px; |
||||
} |
||||
.main{ |
||||
min-height: 755px; |
||||
} |
||||
/deep/ .el-table td{ |
||||
padding: 15px!important; |
||||
} |
||||
</style> |
||||
|
||||
|
@ -0,0 +1,230 @@ |
||||
<template> |
||||
<div> |
||||
<!-- 找回密码card --> |
||||
<div class="Login_view Retrieve_view"> |
||||
<div class="flex-between login_title"> |
||||
<div class="Steps_view flex-center"> |
||||
<p class="Steps1"></p> |
||||
<p class="Steps1_node"></p> |
||||
<p class="Steps2"></p> |
||||
<p class="Steps2_node"></p> |
||||
</div> |
||||
<i class="el-icon-close" @click="gohome"></i> |
||||
</div> |
||||
|
||||
<div class="Steps_title"> |
||||
<span>找回密码</span> |
||||
<span class="Steps2_span">重新设置密码</span> |
||||
</div> |
||||
|
||||
<el-form :model="param" :rules="rules" ref="param" label-width="0px" class="login_form"> |
||||
<el-form-item prop="username"> |
||||
<p>手机号</p> |
||||
<el-input v-model="param.username" placeholder="请输入手机号" maxlength="11"></el-input> |
||||
</el-form-item> |
||||
|
||||
<el-form-item prop="code" class="item_password"> |
||||
<p>验证码</p> |
||||
<div class="flex-between"> |
||||
<el-input placeholder="请输入验证码" v-model="param.code" maxlength="6" @keyup.enter.native="nextStep('param')"></el-input> |
||||
<el-button type="primary" round @click="countDown(bindPhoneDisabled)" class="code-btn">{{content}}</el-button> |
||||
</div> |
||||
</el-form-item> |
||||
|
||||
<div class="login-btn"> |
||||
<el-button class="wd100" type="primary" round @click="nextStep('param')">下一步</el-button> |
||||
</div> |
||||
</el-form> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import bus from './bus'; |
||||
import { verifyMobile,phoneCode } from '../../utils/api'; |
||||
export default { |
||||
data() { |
||||
return { |
||||
param: { |
||||
username: '', |
||||
code: '' |
||||
}, |
||||
rules: { |
||||
username: [{ required: true, message: '请输入手机号', trigger: 'blur' }], |
||||
code: [{ required: true, message: '请输入验证码', trigger: 'blur' }] |
||||
}, |
||||
checked: false, |
||||
content: '发送验证码', |
||||
canClick: true, //添加canClick |
||||
totalTime: 60, |
||||
bindPhoneDisabled: true, |
||||
}; |
||||
}, |
||||
watch:{ |
||||
'param.username': function (val) { |
||||
if (this.fnChangePhone(val)) { |
||||
this.bindPhoneDisabled = false; |
||||
} |
||||
}, |
||||
}, |
||||
methods: { |
||||
async getCode(){ |
||||
let res = phoneCode({mobile:this.param.username}) |
||||
if(res.code===10000){ |
||||
this.$message.success('已发送') |
||||
} |
||||
}, |
||||
// 发送验证码--弹框专属 |
||||
countDown(val, from) { |
||||
if (val === false) { |
||||
if (!this.canClick) return; |
||||
this.getCode(); |
||||
this.canClick = false; |
||||
this.content = this.totalTime + 's后重新发送'; |
||||
let clock = window.setInterval(() => { |
||||
this.totalTime--; |
||||
this.content = this.totalTime + 's后重新发送'; |
||||
if (this.totalTime < 0) { |
||||
window.clearInterval(clock); |
||||
this.content = '重新发送验证码'; |
||||
this.totalTime = 60; |
||||
this.canClick = true; //这里重新开启 |
||||
} |
||||
}, 1000); |
||||
} else { |
||||
this.$message.error('请输入正确的手机号'); |
||||
this.bindPhoneDisabled = true; |
||||
} |
||||
}, |
||||
// 读取手机号,做一个判断 |
||||
fnChangePhone(str) { |
||||
if (!str) { |
||||
return false; |
||||
} |
||||
let re = /^1[3456789]\d{9}$/; |
||||
if (re.test(str)) { |
||||
return true |
||||
} else { |
||||
return false |
||||
} |
||||
}, |
||||
nextStep(param){ |
||||
this.$refs.param.validate(valid => { |
||||
if (valid) { |
||||
let newToken = sessionStorage.getItem("token") |
||||
sessionStorage.removeItem("token"); |
||||
verifyMobile({ |
||||
phoneAccount: this.param.username, |
||||
verifyCode: this.param.code |
||||
}).then(res => { |
||||
this.$emit("nextStep", 3) |
||||
bus.$emit('phoneData', this.param) |
||||
sessionStorage.setItem("token",newToken); |
||||
}).catch(res => { |
||||
}); |
||||
} |
||||
}); |
||||
}, |
||||
gohome(){ |
||||
this.$emit("gohome",1) |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
@import url('../../assets/css/common.scss'); |
||||
//提取Steps共同样式 |
||||
@mixin Steps_node { |
||||
width: 16px; |
||||
height: 16px; |
||||
border-radius: 50%; |
||||
} |
||||
.Login_view{ |
||||
position: absolute; |
||||
left: 50%; |
||||
top: 120px; |
||||
transform: translate(-50%, 0); |
||||
background-color: #fff; |
||||
border-radius: 20px; |
||||
width: 812px; |
||||
padding: 52px 0; |
||||
.login_title{ |
||||
span{ |
||||
font-size: 26px; |
||||
margin-left: 146px; |
||||
} |
||||
i{ |
||||
margin-right: 50px; |
||||
color: #666; |
||||
font-size: 20px; |
||||
} |
||||
} |
||||
.login_form{ |
||||
margin: 60px 146px 0 146px; |
||||
p{ |
||||
margin-bottom: 10px; |
||||
font-size: 14px; |
||||
} |
||||
.item_password{ |
||||
margin-top: 40px; |
||||
} |
||||
.login-btn{ |
||||
margin-top: 70px; |
||||
} |
||||
.forget_view{ |
||||
font-size: 14px; |
||||
} |
||||
.login-wechat{ |
||||
text-align: center; |
||||
color: #00B9FF; |
||||
font-size: 14px; |
||||
margin-top: 60px; |
||||
} |
||||
} |
||||
} |
||||
.Retrieve_view{ |
||||
padding: 30px 0 90px 0; |
||||
.login_title{ |
||||
.Steps_view{ |
||||
margin-left: 146px; |
||||
.Steps1{ |
||||
height: 1px; |
||||
width: 28px; |
||||
background-color: #00B9FF; |
||||
} |
||||
.Steps1_node{ |
||||
@include Steps_node; |
||||
background-color: #00B9FF; |
||||
} |
||||
.Steps2{ |
||||
height: 1px; |
||||
width: 150px; |
||||
background-color: #ccc; |
||||
} |
||||
.Steps2_node{ |
||||
@include Steps_node; |
||||
background-color: #ccc; |
||||
} |
||||
} |
||||
i{ |
||||
margin-right: 50px; |
||||
color: #666; |
||||
font-size: 20px; |
||||
} |
||||
} |
||||
.Steps_title{ |
||||
font-size: 16px; |
||||
margin-left: 146px; |
||||
.Steps2_span{ |
||||
margin-left: 70px; |
||||
color: #ccc; |
||||
} |
||||
} |
||||
.code-btn{ |
||||
margin-left: 20px; |
||||
} |
||||
} |
||||
</style> |
||||
|
||||
|