wucl 1 jaar geleden
bovenliggende
commit
668327b35d

+ 0 - 1
public/ueditor/themes/iframe.css

@@ -1 +0,0 @@
-/*可以在这里添加你自己的css*/

+ 104 - 14
public/ueditor/ueditor.config.js

@@ -34,17 +34,107 @@
 
         //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义
         , toolbars: [[
-            'source', '|', 'undo', 'redo', '|',
-            'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',
-            'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
-            'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',
-            'directionalityltr', 'directionalityrtl', 'indent', '|',
-            'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',
-            'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
-            'simpleupload', 'insertimage',  'scrawl', 'insertcode', 'pagebreak', 'template', '|',
-            'horizontal', 'date', 'time', 'spechars', 'wordimage', '|',
-            'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|',
-            'print', 'preview', 'searchreplace', 'help'
+            // 'source', '|', 'undo', 'redo', '|',
+            // 'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',
+            // 'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
+            // 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',
+            // 'directionalityltr', 'directionalityrtl', 'indent', '|',
+            // 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',
+            // 'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
+            // 'simpleupload', 'insertimage',  'scrawl', 'insertcode', 'pagebreak', 'template', '|',
+            // 'horizontal', 'date', 'time', 'spechars', 'wordimage', '|',
+            // 'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|',
+            // 'print', 'preview', 'searchreplace', 'help'
+            //'source', //源代码
+            //'anchor', //锚点
+            'undo', //撤销
+            'redo', //重做
+            'bold', //加粗
+            'indent', //首行缩进
+            'italic', //斜体
+            'underline', //下划线
+            'strikethrough', //删除线
+            'subscript', //下标
+            'fontborder', //字符边框
+            'superscript', //上标
+            'formatmatch', //格式刷
+            
+            //'blockquote', //引用
+            'pasteplain', //纯文本粘贴模式
+            'selectall', //全选
+            //'print', //打印
+            //'preview', //预览
+            'horizontal', //分隔线
+            'removeformat', //清除格式
+            'time', //时间
+            'date', //日期
+            'unlink', //取消链接
+            'insertrow', //前插入行
+            'insertcol', //前插入列
+            'mergeright', //右合并单元格
+            'mergedown', //下合并单元格
+            'deleterow', //删除行
+            'deletecol', //删除列
+            'splittorows', //拆分成行
+            'splittocols', //拆分成列
+            'splittocells', //完全拆分单元格
+            'deletecaption', //删除表格标题
+            'inserttitle', //插入标题
+            'mergecells', //合并多个单元格
+            'deletetable', //删除表格
+            'cleardoc', //清空文档
+            'insertparagraphbeforetable', //"表格前插入行"
+            'insertcode', //代码语言
+            'fontfamily', //字体
+            'fontsize', //字号
+            'paragraph', //段落格式
+            'simpleupload', //单图上传
+            'insertimage', //多图上传
+            'edittable', //表格属性
+            'edittd', //单元格属性
+            'link', //超链接
+            //'emotion', //表情
+            'spechars', //特殊字符
+            'searchreplace', //查询替换
+            //'map', //Baidu地图
+            //'gmap', //Google地图
+           // 'insertvideo', //视频
+            'help', //帮助
+            'justifyleft', //居左对齐
+            'justifyright', //居右对齐
+            'justifycenter', //居中对齐
+            'justifyjustify', //两端对齐
+            'forecolor', //字体颜色
+            'backcolor', //背景色
+            'insertorderedlist', //有序列表
+            'insertunorderedlist', //无序列表
+            //'fullscreen', //全屏
+            'directionalityltr', //从左向右输入
+            'directionalityrtl', //从右向左输入
+            'rowspacingtop', //段前距
+            'rowspacingbottom', //段后距
+            'pagebreak', //分页
+            //'insertframe', //插入Iframe
+            //'imagenone', //默认
+            //'imageleft', //左浮动
+            //'imageright', //右浮动
+            //'attachment', //附件
+            'imagecenter', //居中
+            //'wordimage', //图片转存
+            'lineheight', //行间距
+            //'edittip ', //编辑提示
+            'customstyle', //自定义标题
+            'autotypeset', //自动排版
+            //'webapp', //百度应用
+            'touppercase', //字母大写
+            'tolowercase', //字母小写
+            //'background', //背景
+            //'template', //模板
+            //'scrawl', //涂鸦
+            'inserttable', //插入表格
+            //'drafts', // 从草稿箱加载
+            'charts', // 图表
+
         ]]
         //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准
         //,labelMap:{
@@ -58,8 +148,8 @@
 
         //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件:
         //现有如下皮肤:default
-        //,theme:'default'
-        //,themePath:URL +"themes/"
+        // ,theme:'hg'
+        // ,themePath:URL +"themes/"
 
         ,zIndex : 10000    //编辑器层级的基数,默认是900
 
@@ -97,7 +187,7 @@
         //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况)
 
         //启用自动保存
-        //,enableAutoSave: false
+        ,enableAutoSave: false
         //自动保存间隔时间, 单位ms
         //,saveInterval: 500
 

+ 3 - 0
src/api/modules/item.js

@@ -32,5 +32,8 @@ export default {
   },
   changeManager(params){
     return request.put(`item/changeManager`, params)
+  },
+  updateState(params){
+    return request.put(`item/updateState`, params)
   }
 }

+ 3 - 0
src/api/modules/message.js

@@ -9,5 +9,8 @@ export default {
 
   updateRead(params){
     return request.get(`message/updateRead/${params}`)
+  },
+  allRead(){
+    return request.get(`message/allRead`)
   }
 }

+ 30 - 0
src/api/modules/workNode.js

@@ -0,0 +1,30 @@
+import request from '@/utils/request'
+/*
+* 工作流节点
+*/
+export default {
+  list(params) {
+    return request.get(`workNode`, { params: params })
+  },
+  detail(params) {
+    return request.get(`workNode/${params}`)
+  },
+  simpleAll() {
+    return request.get(`workNode/simpleAll`)
+  },
+  add(params) {
+    return request.post(`workNode`, params)
+  },
+  edit(params) {
+    return request.put(`workNode`, params)
+  },
+   delete(params) {
+     return request.delete(`workNode/${params}`)
+   },
+   enum(){
+    return request.get(`workNode/enum`)
+   },
+   flow(params){
+    return request.get(`workNode/flow/${params}`)
+   }
+}

+ 30 - 0
src/api/modules/workNodeTask.js

@@ -0,0 +1,30 @@
+import request from '@/utils/request'
+/*
+* 工作流节点任务
+*/
+export default {
+  list(params) {
+    return request.get(`workNodeTask`, { params: params })
+  },
+  detail(params) {
+    return request.get(`workNodeTask/${params}`)
+  },
+  simpleAll() {
+    return request.get(`workNodeTask/simpleAll`)
+  },
+  add(params) {
+    return request.post(`workNodeTask`, params)
+  },
+  edit(params) {
+    return request.put(`workNodeTask`, params)
+  },
+   delete(params) {
+     return request.delete(`workNodeTask/${params}`)
+   },
+   enum(){
+    return request.get(`workNodeTask/enum`)
+   },
+   permissionEnum(){
+    return request.get(`workNodeTask/permission/enum`)
+   }
+}

+ 27 - 0
src/api/modules/workflow.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+/*
+* 工作流
+*/
+export default {
+  list(params) {
+    return request.get(`workFlow`, { params: params })
+  },
+  detail(params) {
+    return request.get(`workFlow/${params}`)
+  },
+  simpleAll() {
+    return request.get(`workFlow/simpleAll`)
+  },
+  add(params) {
+    return request.post(`workFlow`, params)
+  },
+  edit(params) {
+    return request.put(`workFlow`, params)
+  },
+  delete(params) {
+    return request.delete(`workFlow/${params}`)
+  },
+  enum(){
+    return request.get(`workFlow/enum`)
+  }
+}

BIN
src/assets/images/add.png


BIN
src/assets/images/right-arrow.png


BIN
src/assets/statics/pg11.png


+ 29 - 62
src/components/ReportEditor/index.vue

@@ -268,23 +268,30 @@ export default {
       ableAdd:false,
       dialogName:null,
       inputData:{
+        action:null,
+        sectionId:null,
         params:[],
         inputTableData:[
           {
+            tableName:null,
             tableNo:null,
+            tableHead:[],
             tableData:[]
+         
           }
-        ]
+        ],
+        jsonString:null,
       },
-      calculateData:{
-        action:null,
-        calculateDataDTO:{
-          sectionId:null,
-          tableData:[],
-          params:[]
-        },
-        jsonString:null
-      }
+
+      // calculateData:{
+      //   action:null,
+      //   calculateDataDTO:{
+      //     sectionId:null,
+      //     tableData:[],
+      //     params:[]
+      //   },
+      //   jsonString:null
+      // }
     }
   },
 
@@ -398,6 +405,7 @@ export default {
       if (this.activeNode.sectionId != null && this.activeNode.section != null) {
         this.$api.reportSection.edit(this.activeNode).then(res => {
           if (res.code === 200) {
+            this.activeNode.section = res.data;
             this.$notify({
               title: '成功',
               message: '文档段落保存成功',
@@ -595,8 +603,8 @@ export default {
     openTableDialog(headlineName){
         this.dialogVisible =true;
         this.dialogName = headlineName;
-        let headlineId = this.activeNode.id;
-        this.$api.reportSection.structure(headlineId).then(res=>{
+        let sectionId = this.activeNode.sectionId;
+        this.$api.reportSection.structure(sectionId).then(res=>{
           if (res.code === 200){
               this.inputData = res.data;
         }
@@ -614,36 +622,13 @@ export default {
     },
     saveTableData(){
       this.listLoading = true;
-      for (let tableIndex in this.inputData.inputTableData){
-        let tableDatas = this.inputData.inputTableData[tableIndex].tableData;
-        let tableNo = this.inputData.inputTableData[tableIndex].tableNo;
-        for (let dataIndex in tableDatas){
-          for (let key in tableDatas[dataIndex]){
-            if (!tableDatas[dataIndex][key]){
-              this.$message.error('表格参数还有未填项!');
-                return;
-            }
-          }
-        }
-        let table = {"tableNo":tableNo,"data":tableDatas}
-        this.calculateData.calculateDataDTO.tableData.push(table)
-      }
-      for (let p in this.inputData.params){
-        for (let key in this.inputData.params[p]){
-              if (!this.inputData.params[p][key]){
-                this.$message.error('固定参数还有未填项!');
-                return;
-              }
-          }
-      }
-      this.calculateData.action = this.activeNode.action;
-      this.calculateData.calculateDataDTO.sectionId = this.activeNode.sectionId
-      this.calculateData.calculateDataDTO.params = this.inputData.params;
-      this.calculateData.jsonString = JSON.stringify(this.calculateData.calculateDataDTO);
-      this.calculateData.calculateDataDTO = null;
-      console.log(this.calculateData)
-      this.$api.reportSection.calculate(this.calculateData).then(res =>{
-        if (res.code === 200){
+      this.inputData.action = this.activeNode.action;
+      this.inputData.sectionId = this.activeNode.sectionId
+      this.inputData.jsonString = JSON.stringify(this.inputData);
+      console.log(this.activeNode)
+      this.$api.reportSection.calculate(this.inputData).then(res =>{
+        if (res.code === 200 && res.data!=null){
+          this.activeNode.section = res.data;
           this.$notify({
               title: '成功',
               message: '计算结果已生成',
@@ -651,8 +636,8 @@ export default {
               duration: 2000
             })
             this.resetTableData();
-            this.getHeadlineTree();
             this.listLoading = false;
+            this.dialogVisible = false;
         }else {
             this.$notify({
               title: '错误',
@@ -660,35 +645,17 @@ export default {
               type: 'error',
               duration: 2000
             })
-            //this.resetTableData();
             this.listLoading = false;
+            this.dialogVisible = false;
           }
       }).catch(() => {
           this.listLoading = false;
         })
     },
     resetTableData(){
-      this.calculateData = 
-              {action:null,
-                calculateDataDTO:{
-                  sectionId:null,
-                  tableData:[],
-                  params:[]
-                },
-                jsonString:null
-              }
       this.inputData = {};
     },
 
-    getHeadlineTree(){
-      if (this.reportId){
-        this.$api.reportMain.getMainTree(this.reportId).then(res=>{
-          if (res.code === 200){
-              this.headlineTree = res.data;
-          }
-        })
-      }
-    }
   }
 }
 </script>

+ 110 - 0
src/components/workflowNode.vue

@@ -0,0 +1,110 @@
+<template>
+    <div>
+        <div class="node-class">
+            <div class="node-main-class" @click="parentMethod()">
+                <img :src=img alt="" class="node-img-class">
+                <div class="node-name-class">{{name}}</div>
+            </div>
+            <img v-if="!last" src="../assets/images/right-arrow.png" alt="" class="arrow">
+        </div>
+    </div>
+</template>
+
+<script>
+
+import Normal from "@/assets/statics/pg1.png";
+export default {
+    name: "workflowNode",
+    components: {
+        Normal,
+    },
+    props: {
+        name: {
+            type: String,
+            required: true
+        },
+        state:{
+            type: String,
+            required: false,
+        },
+        last:{
+            type: Boolean,
+            required:false,
+            default:false
+        }
+    },
+
+    computed: {
+        img(){
+            if (this.state === "END" || this.state === "START"){
+                return this.end;
+            }
+            if (this.state === "WAITING"){
+                return this.waiting
+            }
+            if (this.state === "PENDING"){
+                return this.pending
+            }
+            if (this.state === "FINISHED"){
+                return this.finished
+            }
+            if (this.state === "EDITING"){
+                return this.editing
+            }
+            return this.normal;
+        }
+    },
+    data() {
+        return {
+            normal:require('@/assets/statics/pg1.png'),
+            end:require('@/assets/statics/pg4.png'),
+            pending:require('@/assets/statics/pg2.png'),
+            finished:require('@/assets/statics/pg6.png'),
+            waiting:require('@/assets/statics/pg11.png'),
+            editing:require('@/assets/statics/pg5.png'),
+        }
+
+    },
+    methods: {
+        parentMethod(){
+            this.$emit('openCurrentNodeDialog');
+        }
+    }
+}
+</script>
+<style scoped lang="css">
+.node-class{
+    width:180px;
+    height:120px;
+    margin:10px 10px 10px 10px;
+    float:left
+}
+ .node-img-class{
+    width:100%;
+    height:120px;
+    border-radius:100%;
+    z-index:10;
+ }
+ .node-name-class{
+    position:relative;
+    font-size:20px;
+    color:white;
+    top:-75px;
+    text-align: center;
+    font-weight:bold;
+    letter-spacing:1px;
+    word-wrap:break-word;
+    word-break:break-all;
+
+ }
+ .arrow{
+    width:30px;
+    height:30px;
+    position:relative;
+    right:-180px;
+    top:-100px;
+ }
+ .node-main-class :hover{
+    cursor:pointer
+ }
+</style>

+ 57 - 36
src/layout/components/Navbar.vue

@@ -5,16 +5,18 @@
     </div>
     <div class="titleDiv"><img src="../../assets/images/logo.png" style="height: 50px;margin-top: 5px;"></div>
     <div class="right-menu" background-color="rgba(42,143,227,1)">
-      <el-dropdown class="message-container right-menu-item" trigger="hover" placement="bottom-start">
 
-        <div class="message-wrapper-nb">
-          <el-badge :value= messageNum>
-            <img src="../../assets/icon/message.png" class="message" alt="">
-          </el-badge>
-        </div>
-        <el-dropdown-menu slot="dropdown" style="border-radius: 20px;">
-          <el-dropdown-item v-if="messages.length>0">
-            <el-card  class="message-info" shadow="hover"  v-for="(item , id) in messages" :key="id" @click.native="toDetail(item)">
+      <el-dropdown class="message-container right-menu-item" trigger="click" placement="bottom-start">
+          <div class="message-wrapper-nb">
+            <el-badge :value=messageNum>
+              <img src="../../assets/icon/message.png" class="message" alt="">
+            </el-badge>
+          </div>
+        <el-dropdown-menu slot="dropdown" class="message-area">
+          <el-dropdown-item v-if="messages.length > 0">
+            <el-button type="success" plain style=" width: 100%; letter-spacing: 10px;" @click="allRead">一键已读</el-button>
+            <el-card class="message-info" shadow="hover" v-for="(item, id) in messages" :key="id"
+              @click.native="toDetail(item)">
               <el-badge is-dot class="red-point">
                 <div class="info-icon">
                   <i class="el-icon-message"></i>
@@ -22,21 +24,24 @@
                 <div class="message-title">
                   {{ item.title }}
                   <div class="message-time">
-                    {{item.created}}
+                    {{ item.created }}
                   </div>
                 </div>
                 <div class="message-content">
-                 {{ showMsg(item)}}
+                  {{ showMsg(item) }}
                 </div>
               </el-badge>
             </el-card>
           </el-dropdown-item>
           <el-dropdown-item v-else>
-            <el-empty :image="require('../../assets/gif/no-message.gif')" :image-size=300 description="还没有消息哟~"></el-empty>
+            <el-empty :image="require('../../assets/gif/no-message.gif')" :image-size=300
+              description="还没有消息哟~"></el-empty>
           </el-dropdown-item>
         </el-dropdown-menu>
       </el-dropdown>
-      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover">
+
+
+      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover" slot="reference">
         <div class="avatar-wrapper-nb">
           <img :src="avatar" class="user-avatar">
           <span style="margin-left: 10px;font-size: 14px;">{{ userInfo.name }}</span>
@@ -65,13 +70,13 @@ import eventBus from '../../utils/eventBus.js'
 
 export default {
 
-  props:{
-    messages:{
+  props: {
+    messages: {
       type: Array,
       require: false,
-      default : []
+      default: []
     },
-    messageNum:{
+    messageNum: {
       type: Number,
       require: true,
       default: null
@@ -83,6 +88,7 @@ export default {
       showLevel1Status: false,
       sysCfg: '',
       avatar,
+      visible: false
     }
   },
   computed: {
@@ -101,44 +107,51 @@ export default {
       this.showLevel1Status = data;
       this.$emit('getStatus', this.showLevel1Status)
     },
-    showMsg(message){
+    showMsg(message) {
       let xMessage = message.message;
-      if (xMessage.length>28){
-        xMessage =  xMessage.substring(0,28) +"...";
+      if (xMessage.length > 28) {
+        xMessage = xMessage.substring(0, 28) + "...";
       }
       return xMessage;
     },
-    toDetail(message){
-      eventBus.$emit("messageId",message.id)
-      if (message.type === 'BUSINESS'){
+    toDetail(message) {
+      eventBus.$emit("messageId", message.id)
+      if (message.type === 'BUSINESS') {
         let m = JSON.parse(message.params);
-        if (m.bizType === 'MARKET_VISIT_REPLY'){
-          this.$router.push({path:'/market/visit/detail',query:{id:m.bizTableId,activeName:'replyList'}});
+        if (m.bizType === 'MARKET_VISIT_REPLY') {
+          this.$router.push({ path: '/market/visit/detail', query: { id: m.bizTableId, activeName: 'replyList' } });
         }
-        if (m.bizType === 'MARKET_LOG_REPLY'){
-          this.$router.push({path:'/market/staff/log'});
+        if (m.bizType === 'MARKET_LOG_REPLY') {
+          this.$router.push({ path: '/market/staff/log' });
         }
       }
 
-      if (message.type === 'SETTLE'){
-        eventBus.$emit("openDig",true)
-        this.$router.push({path:'/brokerage/item/settle'});
+      if (message.type === 'SETTLE') {
+        eventBus.$emit("openDig", true)
+        this.$router.push({ path: '/brokerage/item/settle' });
       }
 
-      if (message.type === 'EVALUATE_REMIND'){
+      if (message.type === 'EVALUATE_REMIND') {
         let m = JSON.parse(message.params);
-        this.$router.push({path:'/item/plan/list',query:{id:m.id,itemName:m.name}});
+        this.$router.push({ path: '/item/plan/list', query: { id: m.id, itemName: m.name } });
       }
     },
 
-    setRead(messageId){
+    setRead(messageId) {
       this.$api.message.updateRead(messageId).then(
-        res =>{
-          if (res.code===200){
+        res => {
+          if (res.code === 200) {
             this.$parent.getMessages();
           }
         }
       );
+    },
+    allRead(){
+      this.$api.message.allRead().then(res=>{
+        if (res.code === 200){
+          this.$parent.getMessages()
+        }
+      })
     }
   }
 }
@@ -274,6 +287,7 @@ export default {
 
   .message-title {
     font-weight: bold;
+
     .message-time {
       font-size: xx-small;
       color: grey;
@@ -291,8 +305,15 @@ export default {
     width: 350px;
   }
 }
-.info-icon{
+
+.info-icon {
   float: left;
   position: relative;
 }
+
+.message-area {
+  border-radius: 20px;
+  height: 800px;
+  overflow-y: scroll;
+}
 </style>

+ 5 - 1
src/router/urlMap.js

@@ -67,6 +67,8 @@ import _views_report_section_template from '@/views/reports/section/list'
 import _views_report_main_edit from '@/views/reports/CommonEditReport'
 import _views_report_land_city_base from '@/views/reports/land/cityBasePrice'
 import _views_report_city_base_edit from '@/views/reports/CommonEditReport'
+import _views_workflow_list from '@/views/set/workflow/list'
+import _views_workflow_detail from '@/views/set/workflow/detail'
 
 export default {
   _views_set_menu,
@@ -122,5 +124,7 @@ export default {
   _views_report_section_template,
   _views_report_main_edit,
   _views_report_land_city_base,
-  _views_report_city_base_edit
+  _views_report_city_base_edit,
+  _views_workflow_list,
+  _views_workflow_detail
 }

+ 2 - 2
src/views/brokerage/deductionTech.vue

@@ -52,7 +52,7 @@
                     <parentTable v-loading="listLoading" :data="pageData.records" slot="table" style="width: 100%;">
                         <el-table-column type="expand">
                             <template slot-scope="{row}">
-                                <parentTable style="font-size: 5px;color: #8c939d" v-loading="listLoading" inline
+                                <parentTable style="font-size: 12px;color: #8c939d" v-loading="listLoading" inline
                                     :data="row.deductionRecords" v-if="row.deductionRecords.length > 0">
                                     <el-table-column align="center" width=285>
                                         <el-tag style="margin-left: 100px;">抵扣项目</el-tag>
@@ -151,7 +151,7 @@
                     <parentTable v-loading="listLoading1" :data="pageData1.records" slot="table" style="width: 100%;">
                         <el-table-column type="expand">
                             <template slot-scope="{row}">
-                                <parentTable style="font-size: 5px;color: #8c939d" v-loading="listLoading1" inline
+                                <parentTable style="font-size: 12px;color: #8c939d" v-loading="listLoading1" inline
                                     :data="row.defaultDeductions" v-if="row.defaultDeductions.length > 0">
                                     <el-table-column align="center" width="285">
                                         <template slot-scope="{row}">

+ 1 - 1
src/views/brokerage/sequence.vue

@@ -100,7 +100,7 @@
       >
         <el-table-column type="expand">
           <template slot-scope="{row}">
-            <parentTable style="font-size: 5px;color: #8c939d" v-loading="listLoading" inline :data="row.details">
+            <parentTable style="font-size: 12px;color: #8c939d" v-loading="listLoading" inline :data="row.details">
               <el-table-column label="项目名称" align="center">
                 <template slot-scope="{row}">
                   <span>{{ row.itemName }}</span>

+ 3 - 4
src/views/item/detail.vue

@@ -377,6 +377,8 @@
           this.postForm.contractUrl = res.data.url;
           const arr = res.data.url.split("-");
           this.contractName = arr[1];
+          const date = new Date();
+          this.postForm.uploadDate = date.getFullYear() + "-" + (this.getZero(date.getMonth() + 1)) + "-" + this.getZero((date.getDate()));
         }else {
           this.$notify({
             title: '错误',
@@ -467,10 +469,7 @@
           });
           return;
         }
-        if (this.postForm.contractUrl){
-          const date = new Date();
-          this.postForm.uploadDate = date.getFullYear() + "-" + (this.getZero(date.getMonth() + 1)) + "-" + this.getZero((date.getDate()));
-        }else {
+        if (!this.postForm.contractUrl){
           this.postForm.uploadDate = null;
         }
         this.$refs.postForm.validate(valid => {

+ 8 - 2
src/views/item/itemIndex.vue

@@ -18,7 +18,7 @@
         <el-button class="button" @click="getStageList('未开始')">未开始</el-button>
       </div>
     </div>
-    <div id="main" >
+    <div id="main" v-loading="listLoading" >
       <el-steps v-for="(s ,index) in stages" :key="index" finish-status="process " simple style="margin-top: 10px">
         <el-tag class="tag" @click.native="toItemPage(s[0].itemName)">{{ s[0].itemName }}</el-tag>
         <div class="sta" v-for="(ss,index) in s" :key="index" :style="bgColor(ss.state)">
@@ -37,8 +37,13 @@
     data() {
       return {
         logStaticsInfo:{},
-        stages: [[]],
+        stages: [[
+          {
+            itemName:null
+          }
+        ]],
         state:'进行中',
+        listLoading:true
       }
     },
     mounted() {
@@ -64,6 +69,7 @@
         this.$api.itemStage.stageList({"state":state}).then(res => {
           if (res.code === 200){
             this.stages = res.data;
+            this.listLoading = false;
           }
         });
       },

+ 110 - 30
src/views/item/list.vue

@@ -12,27 +12,40 @@
           <el-option label="进行中" value="进行中" />
           <el-option label="已完成" value="已完成" />
           <el-option label="未开始" value="未开始" />
+          <el-option label="暂停" value="暂停" />
+          <el-option label="终止" value="终止" />
         </el-select>
         <el-select v-model="listQuery.cate" placeholder="项目类型" clearable filterable
           style="margin-left: 20px;width: 100px;float: left;" class="filter-item">
           <el-option v-for="item in cateList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
         <el-input v-model="listQuery.name" placeholder="项目名称" clearable
-          style="margin-left: 20px;width: 320px;float: left;">
+          style="margin-left: 20px;width: 270px;float: left;">
         </el-input>
         <el-input v-model="listQuery.businessNo" placeholder="流水号" clearable
           style="margin-left: 20px;width: 200px;float: left;">
         </el-input>
         <el-input v-model="listQuery.clientManager" placeholder="客户经理" clearable
-          style="margin-left: 20px;width: 200px;float: left;">
+          style="margin-left: 20px;width: 100px;float: left;">
         </el-input>
         <el-input v-model="listQuery.skiller" placeholder="项目负责人" clearable
-          style="margin-left: 20px;width: 200px;float: left;">
+          style="margin-left: 20px;width: 150px;float: left;">
         </el-input>
         <el-button class="filter-item" style="margin-left: 10px;float: left;" type="primary" @click="searchList" round>搜索
         </el-button>
-        <el-button class="filter-item" style="float: left;" round type="warning" @click="resetSearch()">重置
+        <el-button class="filter-item" style="float: left;" round type="success" @click="resetSearch()">重置
+        </el-button>
+        <el-button  style="margin-left: 10px; float: left;" round type="info" @click="editBusinessState">项目状态
+          <i class="el-icon-edit"></i>
+        </el-button>
+        <div v-if=manySelect style="float: left;">
+          <el-button  style="margin-left: 10px; float: left;" round type="warning" @click="toUpdateState('暂停')">暂停
         </el-button>
+        <el-button  style="margin-left: 10px; float: left;" round type="danger" @click="toUpdateState('终止')">终止
+        </el-button>
+        <el-button  style="margin-left: 10px; float: left;" round  @click="toUpdateState(null)">还原
+        </el-button>
+        </div>
       </template>
       <template slot="right">
         <PermissionButton menu-code="_views_item_export" class-name="filter-item" round type="primary" name="导出"
@@ -42,7 +55,13 @@
           @click="itemMineExport">
         </PermissionButton>
       </template>
-      <parentTable v-loading="listLoading" :data="pageData.records" slot="table" style="width: 100%;">
+      <parentTable v-loading="listLoading" :data="pageData.records" slot="table" style="width: 100%;"  :selectionChange="handleSelectionChange">
+        <el-table-column
+          v-if="manySelect"
+          align="center"
+          type="selection"
+          width="100" border="true">
+        </el-table-column>
         <el-table-column label="项目名称" align="center" width="200">
           <template slot-scope="{row}">
             <span>{{ row.name }}</span>
@@ -88,6 +107,11 @@
             <span>{{ row.amount }}</span>
           </template>
         </el-table-column>
+        <el-table-column label="状态" align="center" width="100">
+          <template slot-scope="{row}">
+            <el-tag>{{ row.itemStatus }}</el-tag>
+          </template>
+        </el-table-column>
         <el-table-column label="客户经理" align="center" width="100">
           <template slot-scope="{row}">
             <span>{{ row.clientManager }}</span>
@@ -98,11 +122,6 @@
             <span>{{ row.skiller }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="状态" align="center" width="100">
-          <template slot-scope="{row}">
-            <el-tag>{{ row.itemStatus }}</el-tag>
-          </template>
-        </el-table-column>
         <el-table-column label="当前阶段" align="center" width="200">
           <template slot-scope="{row}">
             <el-tag>{{ computedStageName(row.stageName) }}</el-tag>
@@ -115,28 +134,46 @@
             <el-button v-else plain round disabled>下载</el-button>
           </template>
         </el-table-column>
-        <el-table-column label="操作" align="center" width="300" fixed="right">
+        <el-table-column label="操作" align="center" width="150" fixed="right">
           <template slot-scope="{row}">
-            <PermissionButton menu-code="_views_item_plan" class-name="filter-item" name="" type="primary"
-              :page-jump="true" :page-query="{ id: row.id, itemName: row.name, listQuery: listQuery }" round
-              size="mini" />
-            <PermissionButton menu-code="_views_item_plan_list" class-name="filter-item" name="" type="primary"
-              :page-jump="true" :page-query="{ id: row.id, itemName: row.name, listQuery: listQuery }" round
-              size="mini" />
-            <PermissionButton menu-code="_view_item_log_write" class-name="filter-item" name="" type="success"
+          <el-dropdown  type="primary">
+              <el-button type="primary" round>
+                更多按钮<i class="el-icon-arrow-down el-icon--right"></i>
+              </el-button>
+            <el-dropdown-menu slot="dropdown" >
+              <el-dropdown-item :divided=true >
+                <PermissionButton menu-code="_views_item_plan" class-name="filter-item" name="" type="primary"
+              :page-jump="true" :page-query="{ id: row.id, itemName: row.name, listQuery: listQuery }" round/>
+              </el-dropdown-item>
+              <el-dropdown-item :divided=true >
+                <PermissionButton menu-code="_views_item_plan_list" class-name="filter-item" name="" type="primary"
+              :page-jump="true" :page-query="{ id: row.id, itemName: row.name, listQuery: listQuery }" round />
+              </el-dropdown-item>
+              <el-dropdown-item :divided=true >
+                <PermissionButton menu-code="_view_item_log_write" class-name="filter-item" name="" type="success"
               :page-jump="true"
-              :page-query="{ id: row.id, itemName: row.name, stageName: row.stageName, stageId: row.stageId, listQuery: listQuery }"
-              round size="mini" />
-            <PermissionButton menu-code="_views_item_rate" class-name="filter-item" name="日志" type="info"
-              :page-jump="true" :page-query="{ id: row.id, listQuery: listQuery }" round size="mini" />
-            <PermissionButton menu-code="_views_item_detail" class-name="filter-item" name="" type="primary"
-              :page-jump="true" :page-query="{ id: row.id, listQuery: listQuery }" round size="mini" />
-            <PermissionButton menu-code="_views_item_detail_readonly" class-name="filter-item" name="" type="primary"
-              :page-jump="true" :page-query="{ id: row.id, listQuery: listQuery }" round size="mini" />
-            <PermissionButton menu-code="_views_item_remove" class-name="filter-item" name="" type="danger" round
-              size="mini" @click="deleteInfo(row.id)" />
-            <PermissionButton menu-code="_views_item_transfer" class-name="filter-item" name="" type="success" round
-              size="mini" @click="transfer(row)" />
+              :page-query="{ id: row.id, itemName: row.name, stageName: row.stageName, stageId: row.stageId, listQuery: listQuery }" round/>
+              </el-dropdown-item>
+              <el-dropdown-item :divided=true >
+                <PermissionButton menu-code="_views_item_rate" class-name="filter-item" name="日志" type="info"
+              :page-jump="true" :page-query="{ id: row.id, listQuery: listQuery }" round  />
+              </el-dropdown-item>
+              <el-dropdown-item :divided=true >
+                <PermissionButton menu-code="_views_item_detail" class-name="filter-item" name="" type="primary"
+              :page-jump="true" :page-query="{ id: row.id, listQuery: listQuery }" round  />
+              </el-dropdown-item>
+              <el-dropdown-item :divided=true >
+                <PermissionButton menu-code="_views_item_detail_readonly" class-name="filter-item" name="" type="primary"
+              :page-jump="true" :page-query="{ id: row.id, listQuery: listQuery }" round  />
+              </el-dropdown-item>
+              <el-dropdown-item :divided=true >
+                <PermissionButton menu-code="_views_item_remove" class-name="filter-item" name="" type="danger" round @click="deleteInfo(row.id)" />
+              </el-dropdown-item>
+              <el-dropdown-item :divided=true >
+                <PermissionButton menu-code="_views_item_transfer" class-name="filter-item" name="" type="success" round @click="transfer(row)" />
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
           </template>
         </el-table-column>
       </parentTable>
@@ -232,6 +269,8 @@ export default {
       activeNames: ['1'],
       historys: [],
       managers: [],
+      multipleSelection: [],
+      manySelect:false
     }
   },
   created() {
@@ -427,8 +466,49 @@ export default {
           this.historys = res.data;
         }
       })
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = [];
+       for ( let v in val){
+          this.multipleSelection.push(val[v].id)
+       }
+      },
+    editBusinessState(){
+        this.manySelect = !this.manySelect
+    },
+    toUpdateState(state){
+      this.$confirm('请确认是否修改这些项目的状态?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+        center: true
+      }).then(() => {
+      let ids = this.multipleSelection;
+      if (ids.length>0){
+        this.$api.item.updateState({"ids":ids,"state":state}).then(res=>{
+          if (res.code === 200){
+            this.$message({
+              type: 'success',
+              message: '项目状态更新成功'
+            });
+            this.getList();
+          }else {
+            this.$message({
+              type: 'danger',
+              message: '项目状态更新失败'
+            });
+          }
+        })
+      }else{
+        this.$message({
+              type: 'warning',
+              message: '请选择需要修改的项目'
+          });
+      }
     }
+    )},
   },
+  
 }
 </script>
 <style lang="scss" scoped>

+ 1 - 1
src/views/login/index.vue

@@ -66,7 +66,7 @@
         </el-form-item>
       </el-form>    
     </div>
-    <div class="tag">v2.0.0705</div>
+    <div class="tag">v2.0.0928</div>
   </div>
 </template>
 

+ 7 - 4
src/views/market/index.vue

@@ -11,7 +11,7 @@
           <y-d-v-over-view style="width: 220px" title="本年已回款" :typeId="5" :ico="require('@/assets/statics/pg9.png')" :data="[{text:marketStaticsInfo.yearPaymentDone,value:'元'}]" @click.native="toPaymentPage('year')"></y-d-v-over-view>
           <y-d-v-over-view style="width: 220px" title="本月已回款" :typeId="6" :ico="require('@/assets/statics/pg9.png')" :data="[{text:marketStaticsInfo.monthPaymentDone,value:'元'}]" @click.native="toPaymentPage('month')"></y-d-v-over-view>
           <el-tooltip class="item" effect="dark" content="当月回款完成率" placement="bottom">
-            <el-progress  style=" margin-left:12px ;width: 91%" :text-inside="true" :stroke-width="24" :percentage="percentage" status="success" />
+            <el-progress  style=" margin-left:12px ;width: 91%" :text-inside="true" :stroke-width="24" :percentage=percentage status="success" />
           </el-tooltip>
         </div>
       </y-data-view-module>
@@ -193,18 +193,22 @@
     created() {
       this.getCanlendarList();
       this.getMarketStat();
+      
     },
     computed:{
       title(){
         return this.currentDate +" 工作计划";
       },
       percentage(){
-        const date = new Date();
+          const date = new Date();
         const month = date.getMonth() + 1;
         const target = this.marketStaticsInfo.yearPaymentTarget;
         const paymentDone = this.marketStaticsInfo.yearPaymentDone;
         const currentTarget = target/10 * month===0?1:target/10 * month;
-        return Math.round((paymentDone/currentTarget) * 100);
+        const percent = Math.round((paymentDone/currentTarget) * 100)
+        if (!isNaN(percent)){
+          return Math.round((paymentDone/currentTarget) * 100);
+        }
       }
     },
     methods: {
@@ -349,7 +353,6 @@
         })
       },
       deltag(val){
-        console.log(val)
         this.$api.note.delete(val).then(data => {
           if (data.code ===200){
             this.$message.success('删除成功')

+ 1 - 1
src/views/market/log/rateCollect.vue

@@ -40,7 +40,7 @@
             <span>{{row.logDate}}</span>
           </template>
         </el-table-column>
-        <el-table-column :label="name" v-for="(name,index) in userNames" :key="index" width="520px" >
+        <el-table-column :label="name" v-for="(name,index) in userNames" :key="index" width="520px">
           <template slot-scope="{row}">
             <div v-for="(l,index) in row.list" :key="index" >
               <div class="content" v-if = "g.userName===name" v-for="(g,index) in l.logs" >

+ 1 - 1
src/views/market/team/list.vue

@@ -44,7 +44,7 @@
       >
         <el-table-column type="expand">
           <template slot-scope="{row}">
-            <parentTable style="font-size: 5px;color: #8c939d" v-loading="listLoading" inline :data="row.members">
+            <parentTable style="font-size: 12px;color: #8c939d" v-loading="listLoading" inline :data="row.members">
               <el-table-column label="组员名称" align="center">
                 <template slot-scope="{row}">
                   <span>{{ row.memberName }}</span>

+ 3 - 3
src/views/reports/land/cityBasePrice.vue

@@ -61,7 +61,7 @@
                 <el-table-column label="报告文档" align="center">
                     <template slot-scope="{row}">
                         <el-button v-if="row.url" type="success" plain round
-                            @click="downloadContract(row.url)">下载</el-button>
+                            @click="downloadContract(row.url,row.title)">下载</el-button>
                         <el-button v-else plain round disabled>下载</el-button>
                     </template>
                 </el-table-column>
@@ -226,10 +226,10 @@ export default {
         closeDialog() {
             this.reportType = null;
         },
-        downloadContract(url) {
+        downloadContract(url,title) {
             var a = document.createElement('a');
             var event = new MouseEvent('click');
-            a.download = url;
+            a.download = title+".docx";
             a.href = url;//路径前拼上前缀,完整路径
             a.dispatchEvent(event);
         },

+ 4 - 3
src/views/reports/land/risk.vue

@@ -61,7 +61,7 @@
                 <el-table-column label="报告文档" align="center">
                     <template slot-scope="{row}">
                         <el-button v-if="row.url" type="success" plain round
-                            @click="downloadContract(row.url)">下载</el-button>
+                            @click="downloadContract(row.url,row.title)">下载</el-button>
                         <el-button v-else plain round disabled>下载</el-button>
                     </template>
                 </el-table-column>
@@ -223,10 +223,11 @@ export default {
         closeDialog() {
             this.reportType = null;
         },
-        downloadContract(url) {
+        downloadContract(url,title) {
             var a = document.createElement('a');
             var event = new MouseEvent('click');
-            a.download = url;
+            a.download = title+".docx";
+            console.log(a.download)
             a.href = url;//路径前拼上前缀,完整路径
             a.dispatchEvent(event);
         },

+ 572 - 0
src/views/set/workflow/detail.vue

@@ -0,0 +1,572 @@
+<template>
+  <div class="app-container">
+    <div class="title-container">
+      <breadcrumb id="breadcrumb-container" class="breadcrumb-container"/>
+    </div>
+    <y-detail-page-layout @save="saveFlow" :edit-status="true" v-loading="vLoading" element-loading-text="处理中。。。" >
+      <div style="padding-top: 30px;">
+        <el-form ref="workflow" :model="workflow" class="form-container">
+          <div class="createPost-main-container">
+            <div class="postInfo-container">
+              <div style="padding-bottom:20px">
+                <el-divider content-position="left">
+                <h3 class="title">
+                  <div class="avatar-wrapper icon-title">flow</div>
+                  <div class="icon-info">工作流</div>
+                </h3>
+                </el-divider>
+                <div style="padding-left:80px;padding-top:20px">
+                  <el-row>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                    
+                      <el-form-item
+                        label="名称:"
+                        prop="name"
+                        :rules="{required: true, message: '工作流名称不能为空', trigger: 'blur'}"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                      <el-select
+                        v-model="workflow.name"
+                        placeholder="若未找到工作流名称,请联系管理员。"
+                        clearable
+                        filterable
+                        class="filter-item"
+                        style="width: 100%"
+                        @change="selectFlow"
+                      >
+                        <el-option v-for="(item, index) in flows" :key="index" :label="item.name" :value="item.name"/>
+                      </el-select>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="编码:"
+                        prop="code"
+                        :rules="{required: true, message: '工作流编码不能为空', trigger: 'blur'}"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                      <el-input :value="workflow.code" class="filter-item" disabled readonly/>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="状态:"
+                        prop="state"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                      <el-switch
+                        style="display: block;margin-top:4px"
+                        v-model="workflow.state"
+                        active-color="#13ce66"
+                        inactive-color="#ff4949"
+                        active-text="启用"
+                        inactive-text="禁用"
+                        active-value="false" inactive-value="true"	
+                        :width=50>
+                      </el-switch>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
+                </div>
+              </div>
+              <div style="padding-bottom:20px">
+                <el-divider content-position="left">
+                    <h3 class="title">
+                      <div class="avatar-wrapper icon-title" style="background:rgba(255,175,41,1)">node</div>
+                      <div class="icon-info">
+                        流程节点
+                      </div>
+                    </h3>
+                </el-divider>
+                <div>
+                  <el-button :type="editing==false?'info':'success'" round  style="float:right;margin-right:20px" @click="toEditNoe">编辑节点</el-button>
+                </div>
+                <div class="node-area" >
+                  <div class="node-seq">
+                    <WrokflowNode name="开始" state="START" />
+                    <div class="add-icom" v-if="editing">
+                         <img src="../../../assets/images/add.png" alt="" class="add-node-icom" @click="openDialog(null)"/>
+                      </div>
+                  </div>
+                  <div class="node-seq"  v-for="(n,index) in nodes" :key="index">
+                    <WrokflowNode :key="index" :name="n.name" :state="editing==true?'EDITING':''"  @openCurrentNodeDialog="openCurrentNodeDialog(n)" />
+                    <div class="add-icom" v-if="editing">
+                        <img src="../../../assets/images/add.png" alt="" class="add-node-icom" @click="openDialog(n)"/>
+                    </div>
+                  </div>
+                  <div class="node-seq">
+                    <WrokflowNode name="结束" state="END" :last=true />
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </el-form>
+      </div>
+    </y-detail-page-layout>
+    <el-dialog width="700px" :visible.sync="dialogFormVisible" 
+      custom-class="editNodeDialog" :before-close="cleanDialog">
+      <el-form ref="nodeForm" :model="editNode" label-position="right" label-width="110px"
+        style="width: 520px; margin-left:50px;">
+        <el-form-item label="流程节点:" prop="name" :rules="{ required: true, message: '请填写节点名称', trigger: 'blur' }">
+          <el-select
+            v-model="editNode.code"
+            placeholder="请选择"
+            clearable
+            filterable
+            class="filter-item"
+            style="width: 100%"
+          >
+            <el-option v-for="(item, index) in allNodes" :key="index" :label="item.name" :value="item.code"/>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="节点类型:" prop="type" :rules="{ required: true, message: '请选择节点类型', trigger: 'blur' }">
+          <el-select
+              v-model="editNode.type"
+              placeholder="请选择"
+              clearable
+              filterable
+              class="filter-item"
+              style="width: 100%"
+            >
+              <el-option key="1" label="任务节点" value="TASK"/>
+              <el-option key="2" label="状态节点" value="STATE"/>
+            </el-select>
+        </el-form-item>
+          <el-form-item label="节点任务:" prop="tasks">
+        <el-checkbox-group v-model="editNode.taskItems" :disabled = "editNode.type === null || editNode.type ==='STATE'" >
+          <el-checkbox v-for="(t,index) in taksEnums" :key="index" :label="t.description"	  name="tasks" @change="addToTasks(t)">{{t.description}}
+          </el-checkbox>
+        </el-checkbox-group>
+      </el-form-item>
+      <el-form-item :label="t.description+':'" :prop="t.description" v-for="(t,index) in editNode.tasks" :key="index">
+          <el-select
+              v-model="editNode.tasks[index].name"
+              placeholder="处理人类型"
+              clearable
+              filterable
+              class="filter-item"
+              style="width: 47.5%"
+              @change="getOptions(editNode.tasks[index].name,editNode.tasks[index])"
+            >
+            <el-option v-for="(permission, index) in permissionEnum" :key="index" :label="permission.name" :value="permission.code"/>
+          </el-select>
+          <el-select
+              v-if="editNode.tasks[index].name === 'EMPLOYEE'"
+              v-model="editNode.tasks[index].powerId"
+              placeholder="请选择员工"
+              clearable
+              filterable
+              class="filter-item"
+              style="width: 50%;margin-left:10px"
+            >
+            <el-option v-for="(user, index) in allUser" :key="index" :label="user.name" :value="user.id"/>
+          </el-select>
+          <el-select
+              v-if="editNode.tasks[index].name === 'POST'"
+              v-model="editNode.tasks[index].powerId"
+              placeholder="请选择岗位"
+              clearable
+              filterable
+              class="filter-item"
+              style="width: 50%;margin-left:10px"
+            >
+            <el-option v-for="(post, index) in allPost" :key="index" :label="post.name" :value="post.id"/>
+          </el-select>
+      </el-form-item>
+     
+      <el-form-item label="限时完成:" prop="deadline">
+        <el-input
+          v-model.number="editNode.deadlineNumber"
+          placeholder="请输入内容"
+        >
+          <el-select  slot="append" v-model="editNode.deadlineType" style="width: 130px;">
+            <el-option label="小时" value="HOUR" ></el-option>
+            <el-option label="分钟" value="MINUTE"></el-option>
+          </el-select>
+        </el-input>
+      </el-form-item>
+        <el-form-item label="可退回:" >
+          <el-switch v-model="editNode.reversible" />
+          <div style="float:right;margin-top:-10px;margin-left:3px">
+            <el-alert
+              title="当前节点的审批人可以将流程退回到上一个节点。"
+              type="info"
+              :closable="false"
+              show-icon>
+            </el-alert>
+          </div>
+        </el-form-item>
+        <el-form-item label="可重置:" >
+          <el-switch v-model="editNode.restartable" />
+          <div style="float:right;margin-top:-10px;margin-left:3px">
+            <el-alert
+              title="当前节点的审批人可以将流程退回到第一个节点。"
+              type="info"
+              :closable="false"
+              show-icon>
+            </el-alert>
+          </div>
+        </el-form-item>
+        <el-form-item label="可跳过:" >
+          <el-switch v-model="editNode.skippable" />
+          <div style="float:right;margin-top:-10px;margin-right:12px">
+            <el-alert
+              title="当前节点允许审批人不处理,进入下一个节点。"
+              type="info"
+              :closable="false"
+              show-icon>
+            </el-alert>
+          </div>
+        </el-form-item>
+        <el-form-item label="可终止:" >
+          <el-switch v-model="editNode.terminable" />
+          <div style="float:right;margin-top:-10px;margin-right:78px">
+            <el-alert
+              title="当前节点的审批人可以将流程终止。"
+              type="info"
+              :closable="false"
+              show-icon>
+            </el-alert>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer"  style="text-align:center;">
+        <el-button v-if="editNode.id" type="danger" @click="delNode" style="width:520px;margin-bottom:10px" :disabled="!editing">删除</el-button>
+        <el-button type="success" @click="saveNode" style="width:520px" :disabled="!editing">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+  import Breadcrumb from '@/components/Breadcrumb';
+  import WrokflowNode from '@/components/workflowNode'
+
+  export default {
+    name: 'workflowDetail',
+    components: {
+      Breadcrumb,
+      WrokflowNode
+    },
+
+    data() {
+      return {
+        dialogFormVisible:false,
+        vLoading: false,
+        editing:false,
+        postForm:{},
+        nodes:[
+        {
+            flowId:null,
+            priviousNodeId:null,
+            code:null,
+            type:null,
+            name:"",
+            tasks:[],
+            deadlineNumber:null,
+            deadlineType:null,
+            deadline:null,
+            taskItems:[]
+          }
+        ],
+        allNodes:[],
+        editNode:{
+          flowId:null,
+          priviousNodeId:null,
+          code:null,
+          type:null,
+          tasks:[],
+          deadlineNumber:null,
+          deadlineType:"MINUTE",
+          deadline:null,
+          taskItems:[]
+
+        },
+        taksEnums:[
+          {
+            description:null,
+            taskType:null,
+          }
+        ],
+        workflow:{
+          id:null,
+          code:null,
+          state:null
+        },
+        permissionEnum:[
+          {
+            name:null,
+            code:null
+          }
+        ],
+        allUser:[],
+        allPost:[],
+        flows:[]
+      
+      }
+    },
+    created() {
+      this.workflow = this.$route.query;
+      this.$route.query.back = "/setting/workflow/list";
+      this.getNodeList();
+      this.getFlowsEnum();
+    },
+    methods: {
+      openDialog(node){
+        this.getNodeEnum();
+        this.getAllTaskEnum();
+        this.getAllPermissionEnum();
+        if (node!=null && node.id!=null){
+          this.editNode.priviousNodeId = node.id
+        }
+        this.dialogFormVisible = true;
+      },
+      openCurrentNodeDialog(node){
+        this.getNodeEnum();
+        this.getAllTaskEnum();
+        this.getAllPermissionEnum();
+        this.getOptions("POST",null);
+        this.getOptions("EMPLOYEE",null)
+        this.editNode = node;
+        this.dialogFormVisible = true;
+      },
+      getFlowsEnum(){
+        this.$api.workflow.enum().then(res=>{
+          if (res.code === 200){
+              this.flows = res.data;
+          }
+        })
+      },
+      getNodeEnum(){
+        this.$api.workNode.enum().then(res=>{
+          if (res.code === 200){
+              this.allNodes = res.data;
+          }
+        })
+      },
+      getAllTaskEnum(){
+        this.$api.workNodeTask.enum().then(res=>{
+          if (res.code === 200){
+              this.taksEnums = res.data;
+          }
+        })
+      },
+      getAllPermissionEnum(){
+        this.$api.workNodeTask.permissionEnum().then(res=>{
+          if (res.code === 200){
+              this.permissionEnum = res.data;
+          }
+        })
+      },
+      toEditNoe(){
+        if (!this.workflow.id){
+          this.$notify.error({
+          title: '错误',
+          message: '请先保存工作流名称和编码。'
+        });
+        return ;
+        }
+        this.editing = !this.editing;
+      },
+      saveFlow(){
+        let workflow = this.workflow;
+        this.$refs.workflow.validate(valid => {
+            if (valid){
+              if (workflow.id!=null){
+          this.$api.workflow.edit(workflow).then(res=>{
+            if (res.code === 200 && res.data ){
+                this.$notify.success({
+                  title: '成功',
+                  message: '工作流修改成功。'
+                });
+            }else{
+              this.$notify.error({
+                title: '失败',
+                message: '工作流修改失败,请稍后再试。'
+              });
+            }
+          })
+        }else{
+            this.$api.workflow.add(workflow).then(res=>{
+            if (res.code === 200 && res.data !=null ){
+                this.workflow.id = res.data;
+                this.$notify.success({
+                  title: '成功',
+                  message: '工作流保存成功,请继续添加节点。'
+                });
+            }else{
+              this.$notify.error({
+                title: '失败',
+                message: '工作流保存失败,请稍后再试。'
+            });
+          }
+          })
+        }
+            }
+        })
+       
+      },
+      saveNode(){
+         if ( this.workflow.id){
+          this.editNode.flowId = this.workflow.id;
+            if (this.editNode.deadlineNumber && this.editNode.deadlineType==="HOUR"){
+                this.editNode.deadline = this.editNode.deadlineNumber * 60 *60 *1000;
+            }
+            if (this.editNode.deadlineNumber && this.editNode.deadlineType==="MINUTE"){
+                this.editNode.deadline = this.editNode.deadlineNumber *60 *1000;
+            }
+          if (this.editNode.id){
+            this.$api.workNode.edit(this.editNode).then(res=>{
+              if (res.code === 200 && res.data){
+                this.$notify.success({
+                  title: '成功',
+                  message: '节点修改成功。'
+                });
+                this.getNodeList();
+                this.dialogFormVisible = false;
+              }
+           })
+          }else{
+            this.$api.workNode.add(this.editNode).then(res=>{
+              if (res.code === 200 && res.data){
+                this.$notify.success({
+                  title: '成功',
+                  message: '节点保存成功。'
+                });
+                this.getNodeList();
+                this.dialogFormVisible = false;
+              }
+           })
+          }
+           
+         }
+      },
+      getOptions(val,val1){
+          if (val === 'EMPLOYEE'){
+              this.$api.user.simpleAll().then(res=>{
+                if (res.code === 200){
+                  this.allUser = res.data;
+                  return;
+                }
+              })
+          }
+          if (val === "POST"){
+              this.$api.post.xSimpleAll().then(res=>{
+                if (res.code === 200){
+                  this.allPost = res.data;
+                  return;
+                }
+              })
+          }
+          if (val1){
+            if (val1.powerId){
+                val1.powerId = null;
+            }
+            let permission = JSON.parse(val1.handlerPermission);
+            if(permission.powerId){
+              permission.powerId = null;
+              val1.handlerPermission = JSON.stringify(permission);
+            };
+          }
+      },
+      cleanDialog(done){
+        this.editNode = {   
+          flowId:null,
+          priviousNodeId:null,
+          code:null,
+          type:null,
+          tasks:[],
+          deadlineNumber:null,
+          deadlineType:"MINUTE",
+          deadline:null,
+          taskItems:[]}
+          done();
+      },
+
+      addToTasks(t){
+        let taskItems = this.editNode.tasks.map(item=>item.taskType)
+        if (!taskItems.includes(t.taskType)){
+          this.editNode.tasks.push(t)
+        }else{
+          let index = 0;
+          let flag = false;
+          for ( let i in this.editNode.tasks){
+              if (this.editNode.tasks[i].taskType === t.taskType){
+                  index = i;
+                  flag = true
+                  break;
+              }else {
+                  flag = false
+              }
+          }
+          if (flag) {
+            this.editNode.tasks.splice(index, 1);
+          }
+        }
+          
+      },
+      getNodeList(){
+        const flowId = this.workflow.id;
+        this.$api.workNode.flow(flowId).then(res=>{
+          if (res.code === 200){
+            const nodes =  res.data;
+            for (let node in nodes){
+                let tasks = nodes[node].tasks;
+                let taskItems = tasks.map(item=>item.description);
+                nodes[node].taskItems = taskItems;
+            }
+            this.nodes = nodes;
+          }
+        })
+      },
+      delNode(){
+        if (this.editNode.id){
+            this.$api.workNode.delete(this.editNode.id).then(res=>{
+              if (res.code === 200 && res.data){
+                this.$notify.success({
+                  title: '成功',
+                  message: '节点删除成功。'
+                });
+                this.getNodeList();
+                this.dialogFormVisible = false;
+              }
+           })
+          }
+      },
+      selectFlow(){
+        if (this.workflow.name){
+          this.workflow.code = this.flows.map(i=>i.code)[0]
+        }
+      }
+    },
+  }
+</script>
+<style lang="scss" scoped>
+.node-area{
+  padding-left:130px;
+  padding-top:20px;
+  width:100%;
+  height:650px;
+}
+.add-icom :hover{
+  cursor:pointer
+}
+.add-node-icom{
+  width:50px;
+  height:50px;
+  margin-top:47px;
+  margin-left:30px;
+}
+
+/deep/.editNodeDialog {
+  border-radius: 20px;
+}
+.node-seq{
+  display:flex;
+  float:left
+}
+</style>

+ 202 - 0
src/views/set/workflow/list.vue

@@ -0,0 +1,202 @@
+<template>
+  <div class="app-container">
+    <div class="title-container">
+      <breadcrumb id="breadcrumb-container" class="breadcrumb-container"/>
+    </div>
+
+    <y-page-list-layout :page-list="pageData" :page-para="listQuery" :get-page-list="getList">
+      <template slot="left">
+        <PermissionButton
+          menu-code="_views_workflow_detail"
+          class="filter-item"
+          type="primary"
+          :pageJump="true"
+          name=""
+          round
+          style="float: left"
+        />
+        <el-input
+          v-model="listQuery.name"
+          placeholder="工作流"
+          clearable
+          style="margin-left: 20px;width: 320px;float: left;"
+        >
+        </el-input>
+        <el-button
+          class="filter-item"
+          style="margin-left: 10px;float: left;"
+          type="primary"
+          @click="searchList"
+          round
+        >搜索
+        </el-button>
+        <el-button
+          class="filter-item"
+          style="float: left;"
+          round
+          type="warning"
+          @click="resetSearch()"
+        >重置
+        </el-button>
+      </template>
+      <parentTable
+        v-loading="listLoading"
+        :data="pageData.records"
+        slot="table"
+        style="width: 100%;"
+      >
+        <el-table-column label="工作流" align="center" >
+          <template slot-scope="{row}">
+            <span>{{ row.name }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="编码" align="center">
+          <template slot-scope="{row}">
+            <span>{{ row.code }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="状态" align="center" >
+          <template slot-scope="{row}">
+            <span>{{ row.state==true?'禁用':'启用' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="创建时间" align="center">
+          <template slot-scope="{row}">
+            <span>{{ row.created}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center">
+          <template slot-scope="{row}">
+            <el-button type="primary" @click="toDetail(row)">编辑</el-button>
+            <el-button type="danger" @click="toRemove(row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </parentTable>
+    </y-page-list-layout>
+  </div>
+</template>
+<script>
+  import YPageListLayout from '@/components/YPageListLayout';
+  import Breadcrumb from '@/components/Breadcrumb';
+  import PermissionButton from '@/components/PermissionButton/PermissionButton';
+
+  export default {
+    name: 'workflowList',
+    components: {
+      Breadcrumb,
+      YPageListLayout,
+      PermissionButton
+    },
+
+    data() {
+      return {
+        tableKey: 0,
+        pageData: { records: [] },
+        total: 20,
+        listLoading: true,
+        listQuery: {
+          page: 1,
+          size: 10,
+          descs: 'id',
+        },
+      }
+    },
+    created() {
+      const that = this;
+      that.getList()
+    },
+    methods: {
+      resetSearch() {
+        this.listQuery = {
+          current: 1,
+          size: 10,
+          descs: 'id',
+        }
+        this.getList()
+      },
+      searchList() {
+        // 重置分页
+        this.listQuery.page = 1
+        this.listQuery.size = 20
+        this.getList()
+      },
+      getList() {
+        const that = this
+        this.listLoading = true
+        this.$api.workflow.list(that.listQuery).then((res) => {
+            that.pageData = res.data;
+            setTimeout(() => {
+              that.listLoading = false
+            }, 200)
+          })
+          .catch(() => {
+            that.listLoading = false
+          })
+      },
+      toDetail(row){
+        this.$router.push({path:"/setting/workflow/add",query:row})
+        
+      },
+      toRemove(row){
+        this.$confirm(`确定删除 ${ row.name }?`, '警告', {
+          confirmButtonText: '确认',
+          cancelButtonText: '取消',
+          type: 'warning',
+        }).then(()=> this.$api.workflow.delete(row.id).then(res =>{
+          if (res.code ===200){
+            this.$notify.success({
+                title: '成功',
+                message: '工作流删除成功。'
+              });
+            this.getList();
+          }else{
+            this.$notify.error({
+              title: '失败',
+              message: '工作流删除失败,请稍后再试。'
+          });
+          }
+        })
+        )
+      }
+    },
+  }
+</script>
+<style lang="scss" scoped>
+  .right {
+    flex: 1;
+
+    .title {
+      font-size: 16px;
+      font-weight: 500;
+      color: rgba(51, 51, 51, 1);
+      line-height: 35px;
+      margin-bottom: 8px;
+    }
+
+    .menu-2-box {
+      display: flex;
+      flex-wrap: wrap;
+      width: 100%;
+    }
+
+    .menu-2-item {
+      display: flex;
+      align-items: center;
+      color: #656565;
+      font-size: 12px;
+      width: 230px;
+      height: 101px;
+      background: rgb(255, 185, 129);
+      border-radius: 3px;
+      padding-left: 20px;
+      margin-right: 10px;
+      margin-bottom: 10px;
+      cursor: pointer;
+      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
+
+      .text {
+        margin-left: 16px;
+      }
+    }
+  }
+</style>