完成岗位页面的增删查改功能

pull/6/head
yzw 2022-07-15 17:29:28 +08:00
parent 866aefe0a8
commit 937f8f0529
7 changed files with 519 additions and 409 deletions

View File

@ -1,86 +1,108 @@
.right-main { .right-main {
/* padding-top: 10px; */ /* padding-top: 10px; */
padding-left: 30px; padding-left: 30px;
padding-right: 30px; padding-right: 30px;
padding-bottom: 100px; padding-bottom: 100px;
} }
.jd-title { .jd-title {
text-align: center; text-align: center;
/* font-family: "Times New Roman","宋体","微软雅黑"; */ /* font-family: "Times New Roman","宋体","微软雅黑"; */
font-size: 2em; font-size: 2em;
/* line-height: 2em; */ /* line-height: 2em; */
} }
.jd-h1 { .jd-h1 {
font-size: 1.5em; font-size: 1.5em;
line-height: 1.8em; line-height: 1.8em;
} }
.jd-h2 { .jd-h2 {
font-size: 1.3em; font-size: 1.3em;
line-height: 1.5em; line-height: 1.5em;
} }
.jd-h3 { .jd-h3 {
font-size: 1.2em; font-size: 1.2em;
line-height: 1.5em; line-height: 1.5em;
text-indent: 1em; text-indent: 1em;
} }
.jd-text { .jd-text {
font-size: 1.1em; font-size: 1.1em;
line-height: 1.5em; line-height: 1.5em;
text-indent: 2em; text-indent: 2em;
} }
.jd-block1 { .jd-li {
margin-top: 15px; font-size: 1.1em;
} line-height: 1.5em;
padding-left: 3em;
.jd-block2 { }
margin-top: 10px;
} .jd-li2 {
padding-left: 1em;
.jd-block3 { }
margin-top: 7px;
} .jd-block1 {
margin-top: 15px;
.jd-table { }
border-collapse: collapse;
width: 80%; .jd-block2 {
margin: 10px auto 0px; margin-top: 10px;
} }
.jd-table tr { .jd-block3 {
height: 2em; margin-top: 7px;
} }
.jd-table table, .jd-table {
th, border-collapse: collapse;
td { width: 80%;
border: 1px solid #ebebeb; margin: 10px auto 0px;
} }
.jd-table td { .jd-table tr {
text-align: center; height: 2em;
} }
.jd-table2 td { .jd-table table,
text-align: left; th,
text-indent: 2em; td {
line-height: 1.5em; border: 1px solid #ebebeb;
} }
.vertical-one { .jd-table td {
width: 2em; text-align: center;
} }
.vertical-two { .jd-table2 td {
width: 3em; padding-left: 1em;
} text-align: left;
/* text-indent: 1em; */
.vertical-four { line-height: 1.5em;
width: 5em; }
}
.vertical-one {
width: 2em;
}
.vertical-two {
width: 3em;
}
.vertical-four {
width: 5em;
}
.confirm-button {
background: #fff;
color:#000;
border: 1px solid #dcdfe6;
border-radius: 5px;
}
.confirm-button:hover {
color: #409eff;
background-color: #ecf5ff;
}

View File

@ -1,13 +1,13 @@
<template> <template>
<div> <ul :key="listKey">
<edit-div <li v-for="(item, index) in dataList" :key="index">
v-for="(item, index) in dataList" <edit-div
:key="index" v-model="dataList[index]"
v-model="dataList[index]" @changeVal="checkList"
@changeVal="checkList" :class="{ add: item == '双击添加' }"
:class="{ add: item == '双击添加' }" ></edit-div>
></edit-div> </li>
</div> </ul>
</template> </template>
<script> <script>
@ -18,20 +18,34 @@ export default {
data() { data() {
return { return {
dataList: this.data, dataList: this.data,
listKey: 0
}; };
}, },
mounted() { mounted() {
if (this.dataList[this.dataList.length - 1] != "双击添加") { if (this.dataList[this.dataList.length - 1] != "双击添加") {
this.dataList.push("双击添加"); this.dataList.push("双击添加");
} }
}, },
methods: { methods: {
checkList() { checkList() {
// ""
for (let i=0; i<this.dataList.length; i++) {
if (!this.dataList[i].trim()) {
this.dataList.splice(i, 1);
break;
}
}
if (this.dataList[this.dataList.length - 1] != "双击添加") { if (this.dataList[this.dataList.length - 1] != "双击添加") {
console.log('add') console.log("add");
this.dataList.push("双击添加"); this.dataList.push("双击添加");
} }
this.reRenderList();
}, },
reRenderList() {
this.listKey = (this.listKey + 1) % 100;
}
}, },
components: { components: {
EditDiv, EditDiv,
@ -44,4 +58,10 @@ export default {
color: #c0c4cc; color: #c0c4cc;
font-size: 0.7em; font-size: 0.7em;
} }
ul {
list-style-type:circle;
margin-top: 0px;
margin-bottom: 0px;
}
</style> </style>

View File

@ -12,7 +12,6 @@ const service = axios.create({
// request interceptor // request interceptor
service.interceptors.request.use( service.interceptors.request.use(
console.log('have a request')
// config => { // config => {
// // do something before request is sent // // do something before request is sent

View File

@ -1,6 +1,21 @@
<template> <template>
<el-main class="right-main"> <el-main class="right-main">
<div class="jd-title">{{ depData.部门名称 }}</div> <div class="jd-title">
<edit-div
v-model="depData.部门名称"
v-if="titleEdit"
></edit-div>
<div v-if="!titleEdit">
{{ depData.部门名称 }}
</div>
</div>
<!-- <div class="jd-title">
<edit-div
v-model="depData.部门名称"
></edit-div>
</div> -->
<div class="jd-block1"> <div class="jd-block1">
<table class="jd-table"> <table class="jd-table">
<tr> <tr>
@ -32,17 +47,17 @@ import EditDiv from "@/components/EditDiv/index.vue";
export default { export default {
name: "DepShow", name: "DepShow",
props: ["data"], props: ["data", "comTitleEdit"],
data() { data() {
return { return {
depData: this.data, depData: this.data,
titleEdit: this.comTitleEdit
}; };
}, },
components: { components: {
EditDiv, EditDiv,
}, },
mounted() { mounted() {},
},
methods: {}, methods: {},
}; };
</script> </script>

View File

@ -1,6 +1,19 @@
<template> <template>
<el-main class="right-main"> <el-main class="right-main">
<div class="jd-title">{{ jobData.岗位名称 }} 岗位说明书</div> <div class="jd-title">
<edit-div
v-model="jobData.岗位名称"
v-if="titleEdit"
></edit-div>
<div v-if="!titleEdit">{{ jobData. }}</div>
</div>
<!-- <div class="jd-title">
<edit-div
v-model="jobData.岗位名称"
></edit-div>
</div> -->
<div class="jd-block1"> <div class="jd-block1">
<div class="jd-h1">岗位概况</div> <div class="jd-h1">岗位概况</div>
<table class="jd-table"> <table class="jd-table">
@ -85,53 +98,59 @@
</div> </div>
<div class="jd-block2"> <div class="jd-block2">
<div class="jd-h2">2工作说明</div> <div class="jd-h2">2工作说明</div>
<div class="jd-block3" v-if="'党风廉政建设' in jobData.工作内容.工作说明"> <div
class="jd-block3"
v-if="'党风廉政建设' in jobData.工作内容.工作说明"
>
<div class="jd-h3">党风廉政建设</div> <div class="jd-h3">党风廉政建设</div>
<edit-list <edit-list
:data="jobData.工作内容.工作说明.党风廉政建设" :data="jobData.工作内容.工作说明.党风廉政建设"
class="jd-text" class="jd-li"
></edit-list> ></edit-list>
</div> </div>
<div class="jd-block3" v-if="'工作职责' in jobData.工作内容.工作说明"> <div class="jd-block3" v-if="'工作职责' in jobData.工作内容.工作说明">
<div class="jd-h3">工作职责</div> <div class="jd-h3">工作职责</div>
<edit-list <edit-list
:data="jobData.工作内容.工作说明.工作职责" :data="jobData.工作内容.工作说明.工作职责"
class="jd-text" class="jd-li"
></edit-list> ></edit-list>
</div> </div>
<div class="jd-block3" v-if="'部门管理' in jobData.工作内容.工作说明"> <div class="jd-block3" v-if="'部门管理' in jobData.工作内容.工作说明">
<div class="jd-h3">部门管理</div> <div class="jd-h3">部门管理</div>
<edit-list <edit-list
:data="jobData.工作内容.工作说明.部门管理" :data="jobData.工作内容.工作说明.部门管理"
class="jd-text" class="jd-li"
></edit-list> ></edit-list>
</div> </div>
<div class="jd-block3" v-if="'业务管理' in jobData.工作内容.工作说明"> <div class="jd-block3" v-if="'业务管理' in jobData.工作内容.工作说明">
<div class="jd-h3">业务管理</div> <div class="jd-h3">业务管理</div>
<edit-list <edit-list
:data="jobData.工作内容.工作说明.业务管理" :data="jobData.工作内容.工作说明.业务管理"
class="jd-text" class="jd-li"
></edit-list> ></edit-list>
</div> </div>
<div class="jd-block3" v-if="'属员管理' in jobData.工作内容.工作说明"> <div class="jd-block3" v-if="'属员管理' in jobData.工作内容.工作说明">
<div class="jd-h3">属员管理</div> <div class="jd-h3">属员管理</div>
<edit-list <edit-list
:data="jobData.工作内容.工作说明.属员管理" :data="jobData.工作内容.工作说明.属员管理"
class="jd-text" class="jd-li"
></edit-list> ></edit-list>
</div> </div>
<div class="jd-block3" v-if="'安全职责' in jobData.工作内容.工作说明"> <div class="jd-block3" v-if="'安全职责' in jobData.工作内容.工作说明">
<div class="jd-h3">安全职责</div> <div class="jd-h3">安全职责</div>
<edit-list <edit-list
:data="jobData.工作内容.工作说明.安全职责" :data="jobData.工作内容.工作说明.安全职责"
class="jd-text" class="jd-li"
></edit-list> ></edit-list>
</div> </div>
<div class="jd-block3" v-if="'临时代理工作' in jobData.工作内容.工作说明"> <div
class="jd-block3"
v-if="'临时代理工作' in jobData.工作内容.工作说明"
>
<div class="jd-h3">兼办协助临时代理工作</div> <div class="jd-h3">兼办协助临时代理工作</div>
<edit-list <edit-list
:data="jobData.工作内容.工作说明.临时代理工作" :data="jobData.工作内容.工作说明.临时代理工作"
class="jd-text" class="jd-li"
></edit-list> ></edit-list>
</div> </div>
</div> </div>
@ -153,7 +172,10 @@
<tr> <tr>
<th colspan="2">工作权限</th> <th colspan="2">工作权限</th>
<td> <td>
<edit-list :data="jobData.工作内容.职权范围.工作权限"></edit-list> <edit-list
:data="jobData.工作内容.职权范围.工作权限"
class="jd-li2"
></edit-list>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -162,6 +184,7 @@
<td> <td>
<edit-list <edit-list
:data="jobData.工作内容.职权范围.沟通关系企业内部" :data="jobData.工作内容.职权范围.沟通关系企业内部"
class="jd-li2"
></edit-list> ></edit-list>
</td> </td>
</tr> </tr>
@ -170,6 +193,7 @@
<td> <td>
<edit-list <edit-list
:data="jobData.工作内容.职权范围.沟通关系企业外部" :data="jobData.工作内容.职权范围.沟通关系企业外部"
class="jd-li2"
></edit-list> ></edit-list>
</td> </td>
</tr> </tr>
@ -301,7 +325,10 @@
<tr> <tr>
<th class="vertical-four">所需技能能力</th> <th class="vertical-four">所需技能能力</th>
<td> <td>
<edit-list :data="jobData.任职资格.所需技能或能力"></edit-list> <edit-list
:data="jobData.任职资格.所需技能或能力"
class="jd-li2"
></edit-list>
<!-- <edit-div v-model="jobData.任职资格.所需技能或能力"></edit-div> --> <!-- <edit-div v-model="jobData.任职资格.所需技能或能力"></edit-div> -->
</td> </td>
</tr> </tr>
@ -340,10 +367,11 @@ import EditList from "@/components/EditList/index.vue";
export default { export default {
name: "JobShow", name: "JobShow",
props: ["data"], props: ["data", "comTitleEdit"],
data() { data() {
return { return {
jobData: this.data jobData: this.data,
titleEdit: this.comTitleEdit
}; };
}, },
methods: { methods: {
@ -352,22 +380,20 @@ export default {
this.jobData[bigDomain][domain] = newVal; this.jobData[bigDomain][domain] = newVal;
}, },
changeCheckGroup(newVal) { changeCheckGroup(newVal) {
// console.log(newVal); // console.log(newVal);
// console.log(this.jobData..); // console.log(this.jobData..);
}, },
getVal() { getVal() {
return this.jobData; return this.jobData;
} },
}, },
components: { components: {
EditText, EditText,
EditDiv, EditDiv,
EditList EditList,
} },
}; };
</script> </script>
<style scoped> <style scoped>
</style> </style>

View File

@ -47,7 +47,7 @@
> >
<el-col :span="2"> <el-col :span="2">
<el-button <el-button
@click="clickSave" @click="clickSaveTree"
size="medium" size="medium"
v-bind:disabled="!allowSave" v-bind:disabled="!allowSave"
>保存</el-button >保存</el-button
@ -59,6 +59,7 @@
style="height: 90%; width: 100%" style="height: 90%; width: 100%"
id="jsmind_container" id="jsmind_container"
v-on:click="clickNode" v-on:click="clickNode"
@dblclick="editNode"
></div> ></div>
</el-container> </el-container>
<el-container class="body-right"> <el-container class="body-right">
@ -87,7 +88,12 @@
</el-row> </el-row>
</el-header> </el-header>
<!-- <job-description :data="jobData" ref="jobDescription"></job-description> --> <!-- <job-description :data="jobData" ref="jobDescription"></job-description> -->
<component :is="comName" :data="comData" :key="comKey"></component> <component
:is="comName"
:data="comData"
:key="comKey"
:comTitleEdit="comTitleEdit"
></component>
</el-container> </el-container>
</el-container> </el-container>
</template> </template>
@ -97,10 +103,10 @@ import "@/assets/css/jsmind.css";
import jsMind from "jsmind/js/jsmind.js"; import jsMind from "jsmind/js/jsmind.js";
window.jsMind = jsMind; window.jsMind = jsMind;
const { init } = require("@/assets/js/jsmind.menu.js"); // const { init } = require("@/assets/js/jsmind.menu.js");
// require("jsmind/js/jsmind.draggable.js"); // require("jsmind/js/jsmind.draggable.js");
require("jsmind/js/jsmind.screenshot.js"); require("jsmind/js/jsmind.screenshot.js");
init(jsMind); // init(jsMind);
import JobDescription from "./components/JobDescription.vue"; import JobDescription from "./components/JobDescription.vue";
import DepDescription from "./components/DepDescription.vue"; import DepDescription from "./components/DepDescription.vue";
@ -153,125 +159,25 @@ export default {
preSelectNodeId: null, preSelectNodeId: null,
curDep: null, curDep: null,
curJob: null, curJob: null,
curNewNode: null,
intervalId: null,
comTitleEdit: null,
}; };
}, },
created() { created() {},
this.jobData = {
岗位名称: "财务科科长",
岗位概况: {
岗位名称: "科长",
岗位级别: "10",
定编人数: "1",
所属部门: "财务科",
岗位类别: "专业管理类",
辖员人数: "9",
直接上级: "分管领导",
直接下级: "副科长",
},
工作内容: {
工作概况:
"依据《会计法》及相关财经法规,开展企业会计审核、会计监督、资金调拨、预算控制、财务分析等财务管理工作,建立、健全现代企业财务管理体系,确保企业稳定健康发展对财务的需求。",
工作说明: {
党风廉政建设:
'1、抓好全面从严治党和党风廉政建设切实履行好党建的“一岗双责”。抓好本部门的党风廉政建设把反腐倡廉、案件防范工作与业务工作同研究、同规划、同布置、同检查、同考核、同问责真正做到"两手抓、两手硬",使党风廉政建设和反腐败工作始终保持应有的力度。',
部门管理: [
"2、根据企业管理规范组织制定企业内部财务管理制度、会计控制规范及会计核算规程以及部门相关的岗位职责、和工作流程",
"3、组织开展本部门综合管理体系的推行与维护工作",
"4、根据预算管理执行本部门费用控制",
"5、对本部门直接管辖范围内人员、场所负全面安全管理责任。",
],
业务管理: [
"6、协助分管财务厂长完善全厂的财务管理体系主持全厂会计核算工作",
"7、组织实施企业全面预算管理工作监督财务预算执行情况上报企业年度及月度财务预算",
"8、组织企业财务分析参与企业生产经营决策编制财务分析资料供领导决策参考",
"9、筹集、调度资金保证企业生产及经营管理的正常运行对资金的需求",
"10、审批会计凭证及各项资金和费用",
"11、监督和参与企业重大采购、投资、资产处置及工程招投标活动",
"12、组织财经法规、财务制度的宣传工作。",
],
属员管理: [
"13、开展本部门员工的绩效管理工作对员工任免提出意见",
"14、组织部门员工培训工作督导企业会计人员的政治学习和业务学习加强团队建设与廉政作风建设增强团队凝聚力。",
],
安全职责: [
"15、保证国家安全生产法规和厂安全生产规章制度在本部门的贯彻执行对本部门的安全工作负全面责任健全安全机构层层落实安全生产责任。",
"16、贯彻“五同时”的原则即在计划、布置、检查、总结、评比生产工作的同时同时计划、布置、检查、总结、评比安全工作。",
"17、监督检查本部门对安全生产各项规章制度的执行情况及时纠正“三违”行为。",
"18、组织制订并实施本部门安全生产管理规定、安全技术操作规程、安全技术措施计划。",
"19、负责组织对部门职工进行经常性的安全思想、安全知识和安全技术教育培训组织并参加厂组织的安全活动至少组织两次部门的安全活动掌握其部门存在的危险因素、防范措施及事故应急措施。",
"20、负责组织本部门安全检查每季度参加本部门安全检查一次以上落实隐患整改保证生产设备、安全设施、消防设施、防护器材等处于完好状态并教育职工加强维护、正确使用。",
"21、负责本部门的应急管理定期开展应急处置预案的演练及评估发生事故应及时现场组织抢救协助事故调查处理。",
"22、负责组织分析本部门安全生产动态向上级领导汇报本部门的安全生产情况。",
],
临时代理工作: ["23、完成上级领导临时交办的其他工作任务。"],
},
职权范围: {
所受监督:
"企业资金安全、资金和费用的审批支付、资金调度、企业预算管理",
所施监督:
"会计核算、财务分析、预算的执行与控制、资金与费用的支付、工程招投标",
工作权限: [
"1、对企业财务预算的分解落实、资金及费用的支付有建议权和执行权",
"2、对企业内部财务管理制度有拟定权和监督权",
"3、企业重大采购、投资、资产处置及工程招投标有监督权",
"4、对财务会计人员的任用、考核、培训、晋升有建议权",
"5、对本部门费用的使用有支配权",
"6、对本厂安全工作有建议权对本部门安全工作有决策权",
"7、有权拒绝违章指挥和强令冒险作业并对他人违章作业加以劝阻和制止。",
],
沟通关系企业内部: [
"与企业领导就预算执行情况、财务分析、资金使用情况等进行请示、汇报;",
"与厂内各科室就安全管理、财务预算、固定资产保管与处置等进行沟通。",
],
沟通关系企业外部: [
"与中烟公司财务部领导就本企业财务预算及资金使用情况等进行汇报;",
"与银行、税务、财政、保险等单位就资金划拨、税收、财产保险等事项进行沟通。",
],
},
工作环境与条件: {
工作时间: "不定时工作制",
工作强度脑力劳动: "中",
工作强度体力劳动: "低",
出差频度: "经常出差",
主要工作场所: "室内",
工作环境的舒适性: "舒适",
工作环境的特殊性: ["无"],
},
},
任职资格: {
学历: "大专及以上",
专业: "财会",
技术职称: "会计师及以上职称",
所需知识: "熟悉会计及税务法规,掌握财务及企业管理知识",
所需技能或能力: [
"具备较强的独立工作能力、良好的沟通与团队协作能力、写作与表达能力;",
"具备良好的人际交往和社会活动能力以及计划和执行能力;",
"对企业财务有较强的理解、分析和判断的能力;",
"熟练掌握财务软件及办公软件。",
],
所需经历或经验:
"行业工作经验5年以上相关中层管理岗位工作经验2年以上。",
所需体能: "身体健康精力充沛能连续工作8小时以上",
所需职业风格: "作风严谨、思维敏捷、开拓创新;为人诚实可靠、品行端正",
},
备注: "无",
};
this.comData = this.jobData;
},
mounted() { mounted() {
// //
jobApi.getFramework().then( jobApi.getFramework().then(
(res) => { (res) => {
let originalMindData = res.data; let originalMindData = res.data;
// id expanded // id expanded
let i = 1; // let i = 1;
originalMindData["id"] = "root";
originalMindData["expanded"] = true; originalMindData["expanded"] = true;
let addId = function (data) { let addId = function (data) {
if (!data.hasOwnProperty("id")) { // if (!data.hasOwnProperty("id")) {
data["id"] = i; // data["id"] = i;
i += 1; // i += 1;
} // }
if (!data.hasOwnProperty("expanded")) { if (!data.hasOwnProperty("expanded")) {
data["expanded"] = false; data["expanded"] = false;
} }
@ -285,7 +191,7 @@ export default {
// //
for (let j = 0; j < originalMindData["children"].length; j++) { for (let j = 0; j < originalMindData["children"].length; j++) {
if (originalMindData["children"][j]["id"] % 2 == 0) { if (j % 2 == 0) {
originalMindData["children"][j]["direction"] = "right"; originalMindData["children"][j]["direction"] = "right";
} else { } else {
originalMindData["children"][j]["direction"] = "left"; originalMindData["children"][j]["direction"] = "left";
@ -301,15 +207,33 @@ export default {
} }
); );
// // this.intervalId = setInterval(() => {
document.onkeydown = function (e) { // if (this.jm) {
// jsmind // //
// console.log(e); // let that = this;
}; // document.onkeydown = function (e) {
// // jsmind
// if (
// e.code == "Enter" &&
// document.activeElement.className == "jsmind-inner"
// ) {
// // Enter
// let node = that.jm.get_selected_node();
// if (node) {
// if (node.topic == "") {
// that.curNewNode = node;
// that.addNewDoc();
// }
// }
// }
// };
// clearInterval(this.intervalId);
// } else {
// }
// }, 1000);
}, },
methods: { methods: {
showChart() { showChart() {
console.log(this.mindIndex);
var mind = { var mind = {
/* 元数据,定义思维导图的名称、作者、版本等信息 */ /* 元数据,定义思维导图的名称、作者、版本等信息 */
meta: { meta: {
@ -349,21 +273,25 @@ export default {
myAddChild: function (jm, e) { myAddChild: function (jm, e) {
let node = jm.get_selected_node(); let node = jm.get_selected_node();
if (node) { if (node) {
let childId = jm.options.maxIndex; if (jm.options.editable) {
jm.options.maxIndex += 1; let childId = jm.options.maxIndex;
jm.add_node(node, childId, "新节点", ""); jm.options.maxIndex += 1;
jm.select_node(jm.get_node(childId)); jm.add_node(node, childId, "新节点", "");
jm.begin_edit(childId); jm.select_node(jm.get_node(childId));
// jm.begin_edit(childId);
}
} }
}, },
myAddBrother: function (jm, e) { myAddBrother: function (jm, e) {
let node = jm.get_selected_node(); let node = jm.get_selected_node();
if (node) { if (node) {
let broId = jm.options.maxIndex; if (jm.options.editable && !node.isroot) {
jm.options.maxIndex += 1; let broId = jm.options.maxIndex;
jm.insert_node_after(node, broId, "新节点", ""); jm.options.maxIndex += 1;
jm.select_node(jm.get_node(broId)); jm.insert_node_after(node, broId, "新节点", "");
jm.begin_edit(broId); jm.select_node(jm.get_node(broId));
// jm.begin_edit(broId);
}
} }
}, },
}, // }, //
@ -380,23 +308,8 @@ export default {
down: 40, // <Down> down: 40, // <Down>
}, },
}, },
menuOpts: { // id
// menu maxIndex: 100000,
showMenu: true, //showMenu true
injectionList: [
{ target: "edit", text: "编辑节点" },
{ target: "delete", text: "删除节点" },
{ target: "addChild", text: "添加子节点" },
{ target: "addBrother", text: "添加兄弟节点" },
],
style: {
menuItem: {
"line-height": "28px",
},
},
},
//
maxIndex: 10000,
}; };
this.jm = new jsMind(options); this.jm = new jsMind(options);
this.jm.show(mind); this.jm.show(mind);
@ -421,17 +334,22 @@ export default {
this.comKey = (this.comKey + 1) % 100; this.comKey = (this.comKey + 1) % 100;
}, },
clickNode() { clickNode() {
// let jsmindElement = document.getElementById('jsmind_container')
// console.log(jsmindElement.hasFocus());
let node = this.jm.get_selected_node(); let node = this.jm.get_selected_node();
if (node) { if (node) {
//
if (node.topic == "新节点") {
// this.curNewNode = node;
// this.addNewDoc();
return;
}
// //
if (node.id === this.preSelectNodeId) { if (node.id === this.preSelectNodeId) {
return; return;
} else { } else {
this.preSelectNodeId = node.id; this.preSelectNodeId = node.id;
} }
// //
if (node.isroot) { if (node.isroot) {
return; return;
@ -440,12 +358,18 @@ export default {
// //
jobApi.getDepartmentDetail({ department: node.topic }).then( jobApi.getDepartmentDetail({ department: node.topic }).then(
(res) => { (res) => {
// if (res.code === 0) {
this.depData = res.data; //
this.comName = "DepDescription"; this.depData = res.data;
this.comData = this.depData; this.comName = "DepDescription";
this.renderComponent(); this.comData = this.depData;
this.curDep = node.topic; this.comTitleEdit = false;
this.renderComponent();
this.curDep = node.topic;
} else {
this.comName = "NoData";
this.comData = null;
}
}, },
(err) => { (err) => {
console.log("err: ", err); console.log("err: ", err);
@ -453,134 +377,132 @@ export default {
); );
} else { } else {
// //
// let jobDep = node.parent.topic; let jobDep = node.parent.topic;
// jobApi.getJobDetail({ department: jobDep, job: node.topic }).then( jobApi.getJobDetail({ department: jobDep, job: node.topic }).then(
// (res) => { (res) => {
// if (res.code === 0) { if (res.code === 0) {
// // //
// this.jobData = res.data; this.jobData = res.data;
// this.comName = "JobDescription"; this.comName = "JobDescription";
// this.comData = this.jobData; this.comData = this.jobData;
// this.renderComponent(); this.comTitleEdit = false;
// this.curDep = jobDep; this.renderComponent();
// this.curJob = node.topic; this.curDep = jobDep;
// } else { this.curJob = node.topic;
// this.comName = "NoData"; } else {
// this.comData = null; this.comName = "NoData";
// } this.comData = null;
// }, }
// (err) => { },
// console.log("err: ", err); (err) => {
// } console.log("err: ", err);
// ); }
);
}
}
},
editNode() {
let node = this.jm.get_selected_node();
if (node) {
if (node.topic == "新节点") {
this.curNewNode = node;
this.addNewDoc();
}
}
},
addNewDoc() {
this.$confirm("新建部门还是岗位?", "提示", {
confirmButtonText: "部门",
confirmButtonClass: "confirm-button",
cancelButtonText: "岗位",
cancelButtonClass: "confirm-button",
type: "success",
})
.then(() => {
this.depData = {
部门名称: "<<部门名称>>",
所属上级组织机构: "<<湖北中烟工业有限责任公司恩施卷烟厂>>",
部门属性: "<<职能部门>>",
是否为虚拟部门: true,
};
this.comName = "DepDescription";
this.comData = this.depData;
this.comTitleEdit = true;
this.renderComponent();
this.curDep = null;
})
.catch(() => {
this.curDep = this.curNewNode.parent.topic;
this.curJob = null;
//
this.jobData = { this.jobData = {
岗位名称: "财务科科长", 岗位名称: "<<岗位名称>>",
岗位概况: { 岗位概况: {
岗位名称: "科长", 岗位名称: "<<科长>>",
岗位级别: "10", 岗位级别: "<<10>>",
定编人数: "1", 定编人数: "<<1>>",
所属部门: "财务科", 所属部门: this.curDep,
岗位类别: "专业管理类", 岗位类别: "<<专业管理类>>",
辖员人数: "9", 辖员人数: "<<9>>",
直接上级: "分管领导", 直接上级: "<<分管领导>>",
直接下级: "副科长", 直接下级: "<<副科长>>",
}, },
工作内容: { 工作内容: {
工作概况: 工作概况: "依据《会计法》及相关财经法规,……",
"依据《会计法》及相关财经法规,开展企业会计审核、会计监督、资金调拨、预算控制、财务分析等财务管理工作,建立、健全现代企业财务管理体系,确保企业稳定健康发展对财务的需求。",
工作说明: { 工作说明: {
党风廉政建设: [ 党风廉政建设: ["抓好全面从严治党和党风廉政建设,……"],
'1、抓好全面从严治党和党风廉政建设切实履行好党建的“一岗双责”。抓好本部门的党风廉政建设把反腐倡廉、案件防范工作与业务工作同研究、同规划、同布置、同检查、同考核、同问责真正做到"两手抓、两手硬",使党风廉政建设和反腐败工作始终保持应有的力度。', 工作职责: [
], "组织制定企业内部财务管理制度、会计控制规范及会计核算规程,……",
部门管理: [
"2、根据企业管理规范组织制定企业内部财务管理制度、会计控制规范及会计核算规程以及部门相关的岗位职责、和工作流程",
"3、组织开展本部门综合管理体系的推行与维护工作",
"4、根据预算管理执行本部门费用控制",
"5、对本部门直接管辖范围内人员、场所负全面安全管理责任。",
],
业务管理: [
"6、协助分管财务厂长完善全厂的财务管理体系主持全厂会计核算工作",
"7、组织实施企业全面预算管理工作监督财务预算执行情况上报企业年度及月度财务预算",
"8、组织企业财务分析参与企业生产经营决策编制财务分析资料供领导决策参考",
"9、筹集、调度资金保证企业生产及经营管理的正常运行对资金的需求",
"10、审批会计凭证及各项资金和费用",
"11、监督和参与企业重大采购、投资、资产处置及工程招投标活动",
"12、组织财经法规、财务制度的宣传工作。",
],
属员管理: [
"13、开展本部门员工的绩效管理工作对员工任免提出意见",
"14、组织部门员工培训工作督导企业会计人员的政治学习和业务学习加强团队建设与廉政作风建设增强团队凝聚力。",
], ],
部门管理: ["根据企业管理规范,……"],
业务管理: ["协助分管财务厂长完善全厂的财务管理体系,……"],
属员管理: ["开展本部门员工的绩效管理工作,……"],
安全职责: [ 安全职责: [
"15、保证国家安全生产法规和厂安全生产规章制度在本部门的贯彻执行对本部门的安全工作负全面责任健全安全机构层层落实安全生产责任。", "保证国家安全生产法规和厂安全生产规章制度在本部门的贯彻执行,……",
"16、贯彻“五同时”的原则即在计划、布置、检查、总结、评比生产工作的同时同时计划、布置、检查、总结、评比安全工作。",
"17、监督检查本部门对安全生产各项规章制度的执行情况及时纠正“三违”行为。",
"18、组织制订并实施本部门安全生产管理规定、安全技术操作规程、安全技术措施计划。",
"19、负责组织对部门职工进行经常性的安全思想、安全知识和安全技术教育培训组织并参加厂组织的安全活动至少组织两次部门的安全活动掌握其部门存在的危险因素、防范措施及事故应急措施。",
"20、负责组织本部门安全检查每季度参加本部门安全检查一次以上落实隐患整改保证生产设备、安全设施、消防设施、防护器材等处于完好状态并教育职工加强维护、正确使用。",
"21、负责本部门的应急管理定期开展应急处置预案的演练及评估发生事故应及时现场组织抢救协助事故调查处理。",
"22、负责组织分析本部门安全生产动态向上级领导汇报本部门的安全生产情况。",
], ],
临时代理工作: ["23、完成上级领导临时交办的其他工作任务"], 临时代理工作: ["完成上级领导临时交办的其他工作任务,……"],
}, },
职权范围: { 职权范围: {
所受监督: 所受监督: "企业资金安全、……",
"企业资金安全、资金和费用的审批支付、资金调度、企业预算管理", 所施监督: "会计核算、……",
所施监督:
"会计核算、财务分析、预算的执行与控制、资金与费用的支付、工程招投标",
工作权限: [ 工作权限: [
"1、对企业财务预算的分解落实、资金及费用的支付有建议权和执行权", "对企业财务预算的分解落实、资金及费用的支付有建议权和执行权……",
"2、对企业内部财务管理制度有拟定权和监督权",
"3、企业重大采购、投资、资产处置及工程招投标有监督权",
"4、对财务会计人员的任用、考核、培训、晋升有建议权",
"5、对本部门费用的使用有支配权",
"6、对本厂安全工作有建议权对本部门安全工作有决策权",
"7、有权拒绝违章指挥和强令冒险作业并对他人违章作业加以劝阻和制止。",
], ],
沟通关系企业内部: [ 沟通关系企业内部: [
"与企业领导就预算执行情况、财务分析、资金使用情况等进行请示、汇报;", "与企业领导就预算执行情况、财务分析、资金使用情况等……",
"与厂内各科室就安全管理、财务预算、固定资产保管与处置等进行沟通。",
], ],
沟通关系企业外部: [ 沟通关系企业外部: [
"与中烟公司财务部领导就本企业财务预算及资金使用情况等进行汇报;", "与中烟公司财务部领导就本企业财务预算及资金使用情况等……",
"与银行、税务、财政、保险等单位就资金划拨、税收、财产保险等事项进行沟通。",
], ],
}, },
工作环境与条件: { 工作环境与条件: {
工作时间: "不定时工作制", 工作时间: "办公班实际工作时间8小时",
工作强度脑力劳动: "", 工作强度脑力劳动: "",
工作强度体力劳动: "", 工作强度体力劳动: "",
出差频度: "经常出差", 出差频度: "驻外工作",
主要工作场所: "室内", 主要工作场所: "室内",
工作环境的舒适性: "舒适", 工作环境的舒适性: "舒适",
工作环境的特殊性: ["无"], 工作环境的特殊性: ["无", "噪音"],
}, },
}, },
任职资格: { 任职资格: {
学历: "大专及以上", 学历: "<<大专及以上>>",
专业: "财会", 专业: "<<财会>>",
技术职称: "会计师及以上职称", 技术职称: "<<会计师及以上职称>>",
所需知识: "熟悉会计及税务法规,掌握财务及企业管理知识", 所需知识: "熟悉会计及税务法规,……",
所需技能或能力: [ 所需技能或能力: ["具备较强的独立工作能力,……"],
"具备较强的独立工作能力、良好的沟通与团队协作能力、写作与表达能力;", 所需经历或经验: "行业工作经验5年以上……",
"具备良好的人际交往和社会活动能力以及计划和执行能力;", 所需体能: "身体健康,……",
"对企业财务有较强的理解、分析和判断的能力;", 所需职业风格: "作风严谨,……",
"熟练掌握财务软件及办公软件。",
],
所需经历或经验:
"行业工作经验5年以上相关中层管理岗位工作经验2年以上。",
所需体能: "身体健康精力充沛能连续工作8小时以上",
所需职业风格:
"作风严谨、思维敏捷、开拓创新;为人诚实可靠、品行端正",
}, },
备注: "无", 备注: "无",
}; };
this.comName = "JobDescription"; this.comName = "JobDescription";
this.comData = this.jobData; this.comData = this.jobData;
this.comTitleEdit = true;
this.renderComponent(); this.renderComponent();
});
}
}
}, },
shotScreen() { shotScreen() {
this.jm.screenshot.shootDownload(); this.jm.screenshot.shootDownload();
@ -607,29 +529,29 @@ export default {
type: "warning", type: "warning",
}); });
this.allowSave = true; this.allowSave = true;
// this.jm.options.editable = true;
this.jm.enable_edit(); this.jm.enable_edit();
}, },
clickSave() { cleanTreeData() {
// //
let deepClone = function (obj, newObj) { // let deepClone = function (obj, newObj) {
var newObj = newObj || {}; // var newObj = newObj || {};
for (let key in obj) { // for (let key in obj) {
if (typeof obj[key] == "object") { // if (typeof obj[key] == "object") {
newObj[key] = obj[key].constructor === Array ? [] : {}; // newObj[key] = obj[key].constructor === Array ? [] : {};
deepClone(obj[key], newObj[key]); // deepClone(obj[key], newObj[key]);
} else { // } else {
newObj[key] = obj[key]; // newObj[key] = obj[key];
} // }
} // }
return newObj; // return newObj;
}; // };
let resData = deepClone(this.jm.get_data("node_tree")["data"]); // let resData = deepClone(this.jm.get_data("node_tree")["data"]);
let resData = this.jm.get_data("node_tree")["data"];
// id, expanded, direction // id, expanded, direction
let removeInvalidAttribution = function (data) { let removeInvalidAttribution = function (data) {
if (data.hasOwnProperty("id")) { // if (data.hasOwnProperty("id")) {
delete data.id; // delete data.id;
} // }
if (data.hasOwnProperty("expanded")) { if (data.hasOwnProperty("expanded")) {
delete data.expanded; delete data.expanded;
} }
@ -638,14 +560,22 @@ export default {
} }
if (data.hasOwnProperty("children")) { if (data.hasOwnProperty("children")) {
for (let i = 0; i < data.children.length; i++) { for (let i = 0; i < data.children.length; i++) {
removeInvalidAttribution(data.children[i]); if (data.children[i].topic == "新节点") {
data.children.splice(i, 1);
i -= 1;
} else {
removeInvalidAttribution(data.children[i]);
}
} }
} }
}; };
removeInvalidAttribution(resData); removeInvalidAttribution(resData);
return resData;
},
clickSaveTree() {
let resData = this.cleanTreeData();
// //
jobApi.modifyFramework(resData).then( jobApi.modifyFramework({ data: resData }).then(
(res) => { (res) => {
if (res.code === 0) { if (res.code === 0) {
Message({ Message({
@ -679,6 +609,7 @@ export default {
// }, err => { // }, err => {
// console.log('err :', err); // console.log('err :', err);
// }) // })
console.log("Hello");
}, },
clickTest1() { clickTest1() {
console.log(this.depData); console.log(this.depData);
@ -687,10 +618,70 @@ export default {
this.comName = "DepDescription"; this.comName = "DepDescription";
this.comData = "Hello"; this.comData = "Hello";
}, },
checkNewNodeValid(nodeName) {
if (nodeName.indexOf("<") != -1 || nodeName.indexOf(">") != -1) {
return "名称不能包含'<' 或 '>'";
}
//
let brotherArr = this.curNewNode.parent.children;
for (let brother of brotherArr) {
if (brother.id != this.curNewNode.id) {
if (brother.topic == nodeName) {
return "名称与不能与兄弟节点重名";
}
}
}
return "合法名称";
},
clickSaveDoc() { clickSaveDoc() {
//
if (this.curNewNode) {
if (this.comName == "DepDescription") {
this.curDep = this.depData.部门名称;
} else {
this.curJob = this.jobData.岗位概况.岗位名称;
}
let nodeName =
this.comName == "DepDescription" ? this.curDep : this.curJob;
let msg = this.checkNewNodeValid(nodeName);
if (msg == "合法名称") {
//
this.jm.update_node(this.curNewNode.id, nodeName);
//
let resData = this.cleanTreeData();
//
jobApi.modifyFramework({ data: resData }).then(
(res) => {
if (res.code == 0) {
}
},
(err) => {
console.log("err: ", err);
}
);
// curNewNode
this.curNewNode = null;
} else {
Message({
message: msg,
type: "error",
duration: 1 * 1000,
});
return;
}
}
//
if (this.comName === "DepDescription") { if (this.comName === "DepDescription") {
// todo //
console.log(this.depData) //
for (let i of Object.keys(this.depData)) {
if (i == "是否为虚拟部门") {
continue;
}
this.depData[i] = this.depData[i].trim();
}
// //
jobApi jobApi
.modifyDepartmentDetail({ .modifyDepartmentDetail({
@ -712,10 +703,47 @@ export default {
} }
); );
} else if (this.comName === "JobDescription") { } else if (this.comName === "JobDescription") {
//
// //
console.log(this.jobData); let tinyData = function (data) {
for (let name in data) {
if (typeof data[name] == "string") {
data[name] = data[name].trim();
} else if (data[name] instanceof Array) {
// ""
let arr = data[name];
while (arr[arr.length - 1] == "双击添加") {
arr.pop();
}
// ""
// for (let i = 0; i < arr.length; i++) {
// if (arr[i].trim() == "") {
// arr.splice(i, 1);
// i -= 1;
// }
// }
//
let deleteArr = [
"党风廉政建设",
"工作职责",
"部门管理",
"业务管理",
"属员管理",
"安全职责",
"临时代理工作",
];
if (!arr.length && deleteArr.includes(name)) {
delete data[name];
}
} else if (data[name] instanceof Object) {
tinyData(data[name]);
} else {
// console.log(data[name]);
}
}
};
tinyData(this.jobData);
//
jobApi jobApi
.modifyJobDetail({ .modifyJobDetail({
data: this.jobData, data: this.jobData,
@ -724,7 +752,7 @@ export default {
}) })
.then( .then(
(res) => { (res) => {
if (res.code === 0) { if (res.code) {
Message({ Message({
message: "保存成功", message: "保存成功",
type: "success", type: "success",

View File

@ -38,8 +38,8 @@ module.exports = {
}, },
proxy: { proxy: {
'/': { '/': {
target: 'http://127.0.0.1:4523/m1/1256020-0-default/', // target: 'http://127.0.0.1:4523/m1/1256020-0-default/',
// target: 'http://192.168.31.102:8000', target: 'http://192.168.31.102:8000',
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
} }