luohairen
2024-12-10 bd63da40b4f5a5130bbb73fc654e7aaa25cacce6
Merge remote-tracking branch 'origin/master'
21个文件已修改
1个文件已添加
773 ■■■■ 已修改文件
.env.development 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.staging 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/flowable/todo.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/styles/index.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Process/panel/PropertiesPanel.vue 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/AppMain.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Navbar.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/task/myProcess/detail/index.vue 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/task/myProcess/detail/index1.vue 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/task/myProcess/send/index.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectEngineering/abnormalProject/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectEngineering/projectLibrary/component/BasicInfo.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectEngineering/projectLibrary/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectEngineering/projectLibrary/projectDetails.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectProcess/detail/index.vue 246 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectProcess/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
@@ -1,10 +1,10 @@
# 页面标题
VUE_APP_TITLE = 射洪项目管理系统
VUE_APP_TITLE = 射洪智慧项目管理系统
# 开发环境配置
ENV = 'development'
# 射洪项目管理系统/开发环境
# 射洪智慧项目管理系统/开发环境
VUE_APP_BASE_API = '/dev-api'
# 路由懒加载
.env.production
@@ -1,10 +1,10 @@
# 页面标题
VUE_APP_TITLE = 射洪项目管理系统
VUE_APP_TITLE = 射洪智慧项目管理系统
# 生产环境配置
ENV = 'production'
# 射洪项目管理系统/生产环境
# 射洪智慧项目管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
# 开打新的tab的url前缀
.env.staging
@@ -1,5 +1,5 @@
# 页面标题
VUE_APP_TITLE = 射洪项目管理系统
VUE_APP_TITLE = 射洪智慧项目管理系统
BABEL_ENV = production
@@ -8,5 +8,5 @@
# 测试环境配置
ENV = 'staging'
# 射洪项目管理系统/测试环境
# 射洪智慧项目管理系统/测试环境
VUE_APP_BASE_API = '/stage-api'
package.json
@@ -1,7 +1,7 @@
{
  "name": "ruoyi",
  "version": "3.8.8",
  "description": "射洪项目管理系统",
  "description": "射洪智慧项目管理系统",
  "author": "射洪项目",
  "license": "MIT",
  "scripts": {
src/api/flowable/todo.js
@@ -131,3 +131,10 @@
    params: query
  })
}
// 流程节点查看详情表单
export function flowTaskFormDetail(taskId) {
  return request({
    url: '/flowable/task/detail/' + taskId,
    method: 'get',
  })
}
src/assets/styles/index.scss
@@ -139,6 +139,10 @@
//main-container全局样式
.app-container {
  padding: 20px;
  height: calc(100vh - 96px);
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
}
// search面板样式
src/components/Process/panel/PropertiesPanel.vue
@@ -6,28 +6,36 @@
      <el-table-column label="属性值" prop="value" min-width="100px" show-overflow-tooltip />
      <el-table-column label="操作" width="90px">
        <template slot-scope="{ row, $index }">
          <el-button size="mini" type="text" @click="openAttributesForm(row, $index)">编辑</el-button>
          <el-divider direction="vertical" />
          <el-button size="mini" type="text" style="color: #ff4d4f" @click="removeAttributes(row, $index)">移除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div class="element-drawer__button">
      <el-button size="mini" type="primary" icon="el-icon-plus" @click="openAttributesForm(null, -1)">添加属性</el-button>
      <el-button size="mini" type="primary" icon="el-icon-setting" @click="openAttributesForm(null, -1)">属性设置</el-button>
    </div>
    <el-dialog :visible.sync="propertyFormModelVisible" title="属性配置" width="600px" append-to-body destroy-on-close>
      <el-form :model="propertyForm" label-width="80px" size="mini" ref="attributeFormRef" @submit.native.prevent>
        <el-form-item label="属性名:" prop="name">
          <el-input v-model="propertyForm.name" clearable />
        </el-form-item>
        <el-form-item label="属性值:" prop="value">
          <el-input v-model="propertyForm.value" clearable />
        </el-form-item>
      </el-form>
      <div v-for="item in canConfigPropertyList">
        <div v-if="item.vueType === 'switch'">
          <el-switch
              v-model="item.value"
              :inactive-text="item.name"
              @change="(val) => item.method(item.name, val === true ? '是' : '否')"
              active-color="#13ce66"
              inactive-color="#ff4949">
          </el-switch>
        </div>
      </div>
<!--      <el-form :model="propertyForm" label-width="80px" size="mini" ref="attributeFormRef" @submit.native.prevent>-->
<!--        <el-form-item label="属性名:" prop="name">-->
<!--          <el-input v-model="propertyForm.name" clearable />-->
<!--        </el-form-item>-->
<!--        <el-form-item label="属性值:" prop="value">-->
<!--          <el-input v-model="propertyForm.value" clearable />-->
<!--        </el-form-item>-->
<!--      </el-form>-->
      <template slot="footer">
        <el-button size="mini" @click="propertyFormModelVisible = false">取 消</el-button>
        <el-button size="mini" type="primary" @click="saveAttribute">确 定</el-button>
        <el-button size="mini" @click="propertyFormModelVisible = false">关 闭</el-button>
      </template>
    </el-dialog>
  </div>
@@ -46,7 +54,19 @@
  },
  data() {
    return {
      elementPropertyList: [],
      canConfigPropertyList: [
        {
          name: '该节点是审批节点',
          value: false,
          vueType: 'switch',
          method: (name, value) => {
            this.propertyForm.name = name
            this.propertyForm.value = value
            this.saveAttribute()
          }
        }
      ], // 可以配置的属性列表
      elementPropertyList: [], // 扩展属性列表
      otherExtensionList: [],
      propertyForm: {},
      editingPropertyIndex: -1,
@@ -74,10 +94,20 @@
          }
          return ex.$type === `flowable:Properties`;
        }) ?? [];
      // 保存所有的 扩展属性字段
      this.bpmnElementPropertyList = this.bpmnElementProperties.reduce((pre, current) => pre.concat(current.values), []);
      // 复制 显示
      // 回显
      this.canConfigPropertyList.forEach(item => {
        const find = this.bpmnElementPropertyList.find(el => el.name === item.name);
        if (find) {
          if (item.vueType === 'switch') {
            item.value = find.value === '是' ? true : false
          }
        }
      })
      console.log(this.canConfigPropertyList, "这是什么鬼")
      this.elementPropertyList = JSON.parse(JSON.stringify(this.bpmnElementPropertyList ?? []));
    },
    openAttributesForm(attr, index) {
@@ -114,15 +144,25 @@
          value
        });
      } else {
        // 新建属性字段
        const newPropertyObject = this.modelerStore.moddle.create(`flowable:Property`, { name, value });
        // 新建一个属性字段的保存列表
        const propertiesObject = this.modelerStore.moddle.create(`flowable:Properties`, {
          values: this.bpmnElementPropertyList.concat([newPropertyObject])
        });
        this.updateElementExtensions(propertiesObject);
        // 如果已经存在这个属性,就做修改
        const find = this.bpmnElementPropertyList.find(item => item.name === name);
        if (find) {
          this.modelerStore.modeling.updateModdleProperties(this.bpmnElement, this.bpmnElementPropertyList[this.bpmnElementPropertyList.indexOf(find)], {
            name,
            value
          });
        } else {
          // 新建属性字段
          const newPropertyObject = this.modelerStore.moddle.create(`flowable:Property`, { name, value });
          // 新建一个属性字段的保存列表
          const propertiesObject = this.modelerStore.moddle.create(`flowable:Properties`, {
            values: this.bpmnElementPropertyList.concat([newPropertyObject])
          });
          this.updateElementExtensions(propertiesObject);
        }
      }
      this.propertyFormModelVisible = false;
      // this.propertyFormModelVisible = false;
      this.$message.success("操作成功")
      this.resetAttributesList();
    },
    updateElementExtensions(properties) {
src/layout/components/AppMain.vue
@@ -29,7 +29,7 @@
<style lang="scss" scoped>
.app-main {
  /* 50= navbar  50  */
  min-height: calc(100vh - 50px);
  // min-height: calc(100vh - 50px);
  width: 100%;
  position: relative;
  overflow: hidden;
@@ -42,7 +42,7 @@
.hasTagsView {
  .app-main {
    /* 84 = navbar + tags-view = 50 + 34 */
    min-height: calc(100vh - 84px);
    min-height: calc(100vh - 96px);
  }
  .fixed-header + .app-main {
src/layout/components/Navbar.vue
@@ -2,7 +2,7 @@
    <div class="navbar">
        <div class="ruoyi-logo">
            <img src="@/assets/logo/logo.png" alt="" />
            <span>射洪项目管理系统</span>
            <span>射洪智慧项目管理系统</span>
        </div>
        <div class="right-menu flex align-center">
            <template>
src/store/modules/user.js
@@ -7,6 +7,7 @@
    id: '',
    name: '',
    avatar: '',
    deptId: null,
    roles: [],
    permissions: []
  },
@@ -26,6 +27,9 @@
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles
    },
    SET_DEPT: (state, deptId) => {
      state.deptId = deptId
    },
    SET_PERMISSIONS: (state, permissions) => {
      state.permissions = permissions
@@ -64,7 +68,9 @@
          }
          commit('SET_ID', user.userId)
          commit('SET_NAME', user.userName)
          commit('SET_DEPT', user.deptId)
          commit('SET_AVATAR', avatar)
          resolve(res)
        }).catch(error => {
          reject(error)
src/utils/request.js
@@ -17,7 +17,7 @@
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 10000
  timeout: 50000
})
// request拦截器
src/views/flowable/task/myProcess/detail/index.vue
@@ -2,14 +2,18 @@
  <div class="app-container">
    <el-card class="box-card" >
      <div slot="header" class="clearfix">
        <span class="el-icon-document">已发任务</span>
        <span class="el-icon-document">已完成任务</span>
        <el-button style="float: right;" size="mini" type="danger" @click="goBack">关闭</el-button>
      </div>
      <el-tabs  tab-position="top" v-model="activeName" @tab-click="handleClick">
        <!--表单信息-->
        <el-tab-pane label="表单信息" name="1">
          <el-col :span="16" :offset="4">
            <v-form-render ref="vFormRef"/>
          <el-col :span="16" :offset="4" v-if="formDataList && formDataList.length > 0">
            <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp">
              <div v-if="formDataObj.current" style="margin-bottom: 15px;color: #409eff">当前阶段:<span style="color: red">{{formDataObj.beforeNodeName}}</span></div>
              <div v-else style="margin-bottom: 15px;color: #409eff">前置阶段:<span style="color: #d5904b">{{formDataObj.beforeNodeName}}</span></div>
              <v-form-render  :form-data="formDataObj.formJson" :ref="'form' + index"/>
            </div>
         </el-col>
        </el-tab-pane>
        <!--流程流转记录-->
@@ -70,6 +74,7 @@
<script>
import {flowRecord} from "@/api/flowable/finished";
import {getProcessVariables, flowXmlAndNode} from "@/api/flowable/definition";
import {flowTaskForm, flowTaskFormDetail} from "@/api/flowable/todo";
import BpmnViewer from '@/components/Process/viewer';
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
@@ -83,12 +88,14 @@
    return {
      // 模型xml数据
      flowData: {},
      formDataList: [],  // 表单列表
      activeName: '1',
      // 查询参数
      queryParams: {},
      // 遮罩层
      loading: true,
      flowRecordList: [], // 流程流转数据
      goBackParams: {},
      taskForm:{
        multiple: false,
        comment:"", // 意见内容
@@ -104,6 +111,7 @@
    this.taskForm.deployId = this.$route.query && this.$route.query.deployId;
    this.taskForm.taskId  = this.$route.query && this.$route.query.taskId;
    this.taskForm.procInsId = this.$route.query && this.$route.query.procInsId;
    this.goBackParams = this.$route.query && this.$route.query.goBackParams;
    // 流程任务重获取变量表单
    this.processVariables( this.taskForm.taskId)
    this.getFlowRecordList(this.taskForm.procInsId, this.taskForm.deployId);
@@ -144,28 +152,47 @@
    processVariables(taskId) {
      if (taskId) {
        // 提交流程申请时填写的表单存入了流程变量中后续任务处理时需要展示
        getProcessVariables(taskId).then(res => {
          this.$nextTick(() => {
            // 回显表单
            this.$refs.vFormRef.setFormJson(res.data.formJson);
        flowTaskFormDetail(taskId).then(res => {
          this.formDataList = res.data
          if (this.formDataList && this.formDataList.length > 0) {
            this.$nextTick(() => {
              // 加载表单填写的数据
              this.$refs.vFormRef.setFormData(res.data);
              this.$nextTick(() => {
                // 表单禁用
                this.$refs.vFormRef.disableForm();
              this.formDataList.forEach((formDataObj, index) => {
                console.log("表单数据列表", formDataObj.formJson)
                let that = this
                console.log(eval("that.$refs.form" + index)[0])
                if (formDataObj.formJsonObj) {
                  eval("that.$refs.form" + index)[0].setFormJson(formDataObj.formJsonObj.formJson);
                  eval("that.$refs.form" + index)[0].setFormData(formDataObj.formJsonObj);
                  this.$nextTick(() => {
                    eval("that.$refs.form" + index)[0].disableForm();
                  })
                }
              })
              // this.formJson = this.formDataList[0].formJsonObj.formJson
            })
          })
          }
          // this.$nextTick(() => {
          //   // 回显表单
          //   this.$refs.vFormRef.setFormJson(res.data.formJson);
          //   this.$nextTick(() => {
          //     // 加载表单填写的数据
          //     this.$refs.vFormRef.setFormData(res.data);
          //     this.$nextTick(() => {
          //       // 表单禁用
          //       this.$refs.vFormRef.disableForm();
          //     })
          //   })
          // })
        });
      }
    },
    /** 返回页面 */
    goBack() {
      // // 关闭当前标签页并返回上个页面
      // const obj = { path: "/task/process", query: { t: Date.now()} };
      // this.$tab.closeOpenPage(obj);
      this.$tab.closePage()
      this.$router.push({
        path: '/projectFlow/detail',
        query: this.goBackParams
      })
    },
  }
};
@@ -198,4 +225,13 @@
.my-label {
  background: #E1F3D8;
}
.form-warp {
  padding: 20px;
  margin-bottom: 20px;
  box-shadow:
    inset 0 -3em 3em rgba(0, 0, 0, 0.1),
    0 0 0 2px rgb(239, 239, 239),
    0.3em 0.3em 1em rgba(0, 0, 0, 0.3);
}
</style>
src/views/flowable/task/myProcess/detail/index1.vue
New file
@@ -0,0 +1,201 @@
<template>
  <div class="app-container">
    <el-card class="box-card" >
      <div slot="header" class="clearfix">
        <span class="el-icon-document">已发任务</span>
        <el-button style="float: right;" size="mini" type="danger" @click="goBack">关闭</el-button>
      </div>
      <el-tabs  tab-position="top" v-model="activeName" @tab-click="handleClick">
        <!--表单信息-->
        <el-tab-pane label="表单信息" name="1">
          <el-col :span="16" :offset="4">
            <v-form-render ref="vFormRef"/>
         </el-col>
        </el-tab-pane>
        <!--流程流转记录-->
        <el-tab-pane label="流转记录" name="2">
          <el-col :span="16" :offset="4" >
            <div class="block">
              <el-timeline>
                <el-timeline-item
                  v-for="(item,index ) in flowRecordList"
                  :key="index"
                  :icon="setIcon(item.finishTime)"
                  :color="setColor(item.finishTime)"
                >
                  <p style="font-weight: 700">{{item.taskName}}</p>
                  <el-card :body-style="{ padding: '10px' }">
                    <el-descriptions class="margin-top" :column="1" size="small" border>
                      <el-descriptions-item v-if="item.assigneeName" label-class-name="my-label">
                        <template slot="label"><i class="el-icon-user"></i>办理人</template>
                        {{item.assigneeName}}
                        <el-tag type="info" size="mini">{{item.deptName}}</el-tag>
                      </el-descriptions-item>
                      <el-descriptions-item v-if="item.candidate" label-class-name="my-label">
                        <template slot="label"><i class="el-icon-user"></i>候选办理</template>
                        {{item.candidate}}
                      </el-descriptions-item>
                      <el-descriptions-item label-class-name="my-label">
                        <template slot="label"><i class="el-icon-date"></i>接收时间</template>
                        {{item.createTime}}
                      </el-descriptions-item>
                      <el-descriptions-item v-if="item.finishTime" label-class-name="my-label">
                        <template slot="label"><i class="el-icon-date"></i>处理时间</template>
                        {{item.finishTime}}
                      </el-descriptions-item>
                      <el-descriptions-item v-if="item.duration"  label-class-name="my-label">
                        <template slot="label"><i class="el-icon-time"></i>耗时</template>
                        {{item.duration}}
                      </el-descriptions-item>
                      <el-descriptions-item v-if="item.comment" label-class-name="my-label">
                        <template slot="label"><i class="el-icon-tickets"></i>处理意见</template>
                        {{item.comment.comment}}
                      </el-descriptions-item>
                    </el-descriptions>
                  </el-card>
                </el-timeline-item>
              </el-timeline>
            </div>
          </el-col>
        </el-tab-pane>
        <!--流程图-->
        <el-tab-pane label="流程图" name="3">
          <bpmn-viewer :flowData="flowData" :procInsId="taskForm.procInsId"/>
        </el-tab-pane>
    </el-tabs>
    </el-card>
  </div>
</template>
<script>
import {flowRecord} from "@/api/flowable/finished";
import {getProcessVariables, flowXmlAndNode} from "@/api/flowable/definition";
import BpmnViewer from '@/components/Process/viewer';
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "Record",
  components: {
    BpmnViewer
  },
  props: {},
  data() {
    return {
      // 模型xml数据
      flowData: {},
      activeName: '1',
      // 查询参数
      queryParams: {},
      // 遮罩层
      loading: true,
      flowRecordList: [], // 流程流转数据
      taskForm:{
        multiple: false,
        comment:"", // 意见内容
        procInsId: "", // 流程实例编号
        instanceId: "", // 流程实例编号
        deployId: "",  // 流程定义编号
        taskId: "" ,// 流程任务编号
        procDefId: "",  // 流程编号
      },
    };
  },
  created() {
    this.taskForm.deployId = this.$route.query && this.$route.query.deployId;
    this.taskForm.taskId  = this.$route.query && this.$route.query.taskId;
    this.taskForm.procInsId = this.$route.query && this.$route.query.procInsId;
    // 流程任务重获取变量表单
    this.processVariables( this.taskForm.taskId)
    this.getFlowRecordList(this.taskForm.procInsId, this.taskForm.deployId);
  },
  methods: {
    handleClick(tab, event) {
      if (tab.name === '3'){
        flowXmlAndNode({procInsId:this.taskForm.procInsId,deployId:this.taskForm.deployId}).then(res => {
          this.flowData = res.data;
        })
      }
    },
    setIcon(val) {
      if (val) {
        return "el-icon-check";
      } else {
        return "el-icon-time";
      }
    },
    setColor(val) {
      if (val) {
        return "#2bc418";
      } else {
        return "#b3bdbb";
      }
    },
    /** 流程流转记录 */
    getFlowRecordList(procInsId, deployId) {
      const that = this
      const params = {procInsId: procInsId, deployId: deployId}
      flowRecord(params).then(res => {
        that.flowRecordList = res.data.flowList;
      }).catch(res => {
        this.goBack();
      })
    },
    /** 获取流程变量内容 */
    processVariables(taskId) {
      if (taskId) {
        // 提交流程申请时填写的表单存入了流程变量中后续任务处理时需要展示
        getProcessVariables(taskId).then(res => {
          this.$nextTick(() => {
            // 回显表单
            this.$refs.vFormRef.setFormJson(res.data.formJson);
            this.$nextTick(() => {
              // 加载表单填写的数据
              this.$refs.vFormRef.setFormData(res.data);
              this.$nextTick(() => {
                // 表单禁用
                this.$refs.vFormRef.disableForm();
              })
            })
          })
        });
      }
    },
    /** 返回页面 */
    goBack() {
      // // 关闭当前标签页并返回上个页面
      // const obj = { path: "/task/process", query: { t: Date.now()} };
      // this.$tab.closeOpenPage(obj);
      this.$tab.closePage()
    },
  }
};
</script>
<style lang="scss" scoped>
.test-form {
  margin: 15px auto;
  width: 800px;
  padding: 15px;
}
.clearfix:before,
.clearfix:after {
  display: table;
  content: "";
}
.clearfix:after {
  clear: both
}
.box-card {
  width: 100%;
  margin-bottom: 20px;
}
.el-tag + .el-tag {
  margin-left: 10px;
}
.my-label {
  background: #E1F3D8;
}
</style>
src/views/flowable/task/myProcess/send/index.vue
@@ -10,7 +10,10 @@
        <el-tab-pane label="表单信息" name="1">
          <!--初始化流程加载表单信息-->
          <el-col :span="16" :offset="4" v-if="formDataList && formDataList.length > 0">
            <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp">
            <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp" style="position: relative">
              <div v-if="!formDataObj.current" style="position: absolute; top: 2px; right: 2px">
                <el-button type="danger" disabled>驳回(功能开发中)</el-button>
              </div>
              <div v-if="formDataObj.current" style="margin-bottom: 15px;color: #409eff">当前阶段:<span style="color: red">{{formDataObj.beforeNodeName}}</span></div>
              <div v-else style="margin-bottom: 15px;color: #409eff">前置阶段:<span style="color: #d5904b">{{formDataObj.beforeNodeName}}</span></div>
              <v-form-render  :form-data="formDataObj.formJson" :ref="'form' + index"/>
@@ -19,8 +22,8 @@
<!--            <v-form-render :form-data="formRenderData" ref="vFormRef"/>-->
            <div style="display: flex;justify-content: center; align-items: center; margin: 20px 0">
              <el-button type="primary" @click="submitForm">确认并提交</el-button>
              <el-button type="primary" @click="submitForm">协同办理</el-button>
              <el-button type="primary" @click="submitForm">转交他人办理</el-button>
              <el-button type="primary" disabled @click="submitForm">协同办理(功能开发中)</el-button>
              <el-button type="primary" disabled @click="submitForm">转交他人办理(功能开发中)</el-button>
<!--              <el-button type="primary" @click="resetForm">重 置</el-button>-->
            </div>
          </el-col>
@@ -62,7 +65,8 @@
  props: {},
  data() {
    return {
      formDataList: [],
      goBackParams: {},
      formDataList: [],  // 表单列表
      taskId: '',
      processName: '',
      // 模型xml数据
@@ -96,6 +100,7 @@
    this.taskId = this.$route.query && this.$route.query.taskId;
    // 初始化表单
    this.procDefId  = this.$route.query && this.$route.query.procDefId;
    this.goBackParams  = this.$route.query && this.$route.query.goBackParams;
    // this.getNextFlowNodeByStart(this.deployId);
    this.getFlowFormData(this.taskId);
  },
@@ -112,8 +117,6 @@
      const params = {taskId: taskId}
      flowTaskForm(params).then(res => {
        this.formDataList = res.data
        // this.formRenderDataList = res.data.map(item => item.formJson)
        // console.log("表单数据列表", this.formRenderDataList)
        if (this.formDataList && this.formDataList.length > 0) {
          this.$nextTick(() => {
            this.formDataList.forEach((formDataObj, index) => {
@@ -154,10 +157,10 @@
    },
    /** 返回页面 */
    goBack() {
      // // 关闭当前标签页并返回上个页面
      // const obj = { path: "/task/process", query: { t: Date.now()} };
      // this.$tab.closeOpenPage(obj);
      this.$tab.closePage()
      this.$router.push({
        path: '/projectFlow/detail',
        query: this.goBackParams
      })
    },
    /** 申请流程表单数据提交 */
    submitForm() {
src/views/login.vue
@@ -2,11 +2,11 @@
    <div class="login">
        <div class="nav">
            <img alt="" src="../assets/images/bj.png" />
            <div class="ml-[10px]">射洪市项目管理系统</div>
            <div class="ml-[10px]">射洪智慧项目管理系统</div>
        </div>
        <div class="conter">
            <div class="left">
                <div class="title">射洪市项目管理系统</div>
                <div class="title">射洪智慧项目管理系统</div>
                <div>
                    运用系统的观点、方法和理论,对项目涉及的全部工作进行有效地管理
                </div>
src/views/projectEngineering/abnormalProject/index.vue
@@ -182,7 +182,7 @@
      v-loading="loading"
      :data="projectInfoList"
      @selection-change="handleSelectionChange"
      height="60vh"
      height="100%"
      sortable="custom"
      :show-overflow-tooltip="true">
      <el-table-column type="selection" width="55" align="center"/>
src/views/projectEngineering/projectLibrary/component/BasicInfo.vue
@@ -304,6 +304,7 @@
import {approvalList} from "@/api/system/dept";
export default {
  name: 'BasicInfo',
  dicts: ['sys_funding_type', 'sys_investment_type', 'sys_project_type', 'sys_project_status', 'sys_competent_department'
    , 'sys_administrative_divisions', 'sys_centralized_management', 'sys_approval_type', 'sys_key_categories', 'sys_annual_plan'],
  components: {
@@ -428,9 +429,10 @@
        this.approvalList = res.data;
      });
    },
    submit() {
    submit(usedStatus) {
      this.$refs["projectForm"].validate(valid => {
        if (valid) {
          this.projectForm.usedStatus = usedStatus;
          if (this.projectForm.id) {
            updateProject(this.projectForm).then(response => {
              this.$modal.msgSuccess("修改成功");
src/views/projectEngineering/projectLibrary/index.vue
@@ -196,13 +196,14 @@
      v-loading="loading"
      :data="projectInfoList"
      @selection-change="handleSelectionChange"
      height="60vh"
      height="100%"
      sortable="custom"
      :show-overflow-tooltip="true">
      <el-table-column type="selection" width="55" align="center"/>
      <!-- 动态列 -->
      <el-table-column
        v-for="item in columns"
        :key="item.id"
        v-if="item.visible"
        :prop="item.id"
        :label="item.label"
@@ -274,7 +275,7 @@
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :page.sync="queryParams.currentPage"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
@@ -338,7 +339,7 @@
      timeRange: [],
      // 查询参数
      queryParams: {
        pageNum: 1,
        currentPage: 1,
        pageSize: 10,
        projectName: null,
        projectCode: null,
@@ -532,7 +533,7 @@
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.queryParams.currentPage = 1;
      this.getList();
    },
    /** 重置按钮操作 */
src/views/projectEngineering/projectLibrary/projectDetails.vue
@@ -1,5 +1,5 @@
<template>
  <el-card class="card-container" >
  <el-card class="card-container">
    <div class="flex-container mb-4">
      <el-tabs v-model="currentTab" @tab-click="handleClick" v-show="isShow">
        <el-tab-pane
@@ -24,7 +24,16 @@
      class="full-width custom-height"
    />
    <div v-if="!disabled" class="button-container">
      <el-button class="save-button" type="primary" @click="submit">保存</el-button>
      <el-button
        v-if="componentName.name == 'BasicInfo'"
        class="save-button"
        type="primary"
        @click="submit(0)"
        >草稿</el-button
      >
      <el-button class="save-button" type="primary" @click="submit(1)"
        >保存</el-button
      >
      <el-button class="reset-button" @click="reset">重置</el-button>
      <!-- <el-button v-else class="cancel-button" @click="cancel">取消</el-button> -->
    </div>
@@ -32,53 +41,53 @@
</template>
<script>
import BasicInfo from '@/views/projectEngineering/projectLibrary/component/BasicInfo';
import InvestInfo from '@/views/projectEngineering/projectLibrary/component/InvestInfo';
import InvestmentFunds from '@/views/projectEngineering/projectLibrary/component/investmentFunds';
import LegalPerson from '@/views/projectEngineering/projectLibrary/component/legalPerson';
import PolicyInfo from '@/views/projectEngineering/projectLibrary/component/PolicyInfo';
import DocumentsInfo from '@/views/projectEngineering/projectLibrary/component/DocumentsInfo';
import BasicInfo from "@/views/projectEngineering/projectLibrary/component/BasicInfo";
import InvestInfo from "@/views/projectEngineering/projectLibrary/component/InvestInfo";
import InvestmentFunds from "@/views/projectEngineering/projectLibrary/component/investmentFunds";
import LegalPerson from "@/views/projectEngineering/projectLibrary/component/legalPerson";
import PolicyInfo from "@/views/projectEngineering/projectLibrary/component/PolicyInfo";
import DocumentsInfo from "@/views/projectEngineering/projectLibrary/component/DocumentsInfo";
export default {
  name: 'ProjectDetails',
  name: "ProjectDetails",
  data() {
    return {
      isShow: false,
      currentTab: '项目管理基础信息',
      currentTab: "项目管理基础信息",
      disabled: false,
      projectForm:{},
      projectForm: {},
      componentName: BasicInfo,
      TABS_DATA: [
        {
          label: '项目管理基础信息',
          value: '项目管理基础信息',
          componentName: BasicInfo
          label: "项目管理基础信息",
          value: "项目管理基础信息",
          componentName: BasicInfo,
        },
        {
          label: '投资管理基础信息',
          value: '投资管理基础信息',
          componentName: InvestInfo
          label: "投资管理基础信息",
          value: "投资管理基础信息",
          componentName: InvestInfo,
        },
        {
          label: '项目投资及资金来源',
          value: '项目投资及资金来源',
          componentName: InvestmentFunds
          label: "项目投资及资金来源",
          value: "项目投资及资金来源",
          componentName: InvestmentFunds,
        },
        {
          label: '项目(法人)单位登记信息',
          value: '项目(法人)单位登记信息',
          componentName: LegalPerson
          label: "项目(法人)单位登记信息",
          value: "项目(法人)单位登记信息",
          componentName: LegalPerson,
        },
        {
          label: '投资项目产业政策符合情况',
          value: '投资项目产业政策符合情况',
          componentName: PolicyInfo
          label: "投资项目产业政策符合情况",
          value: "投资项目产业政策符合情况",
          componentName: PolicyInfo,
        },
        {
          label: '相关文书',
          value: '相关文书',
          componentName: DocumentsInfo
        }
          label: "相关文书",
          value: "相关文书",
          componentName: DocumentsInfo,
        },
      ],
      childRef: null,
    };
@@ -88,29 +97,29 @@
      this.isShow = newValue;
    },
    handleClick(tabTarget) {
        this.componentName = this.TABS_DATA[tabTarget.index].componentName;
      this.componentName = this.TABS_DATA[tabTarget.index].componentName;
    },
    changeTable(index) {
      this.componentName = this.TABS_DATA[index].componentName;
      this.currentTab = this.TABS_DATA[index].value;
    },
    submit() {
      this.$refs.childRef.submit();
    submit(usedStatus) {
      this.$refs.childRef.submit(usedStatus);
    },
    reset() {
      this.$refs.childRef.reset();
    },
  },
  mounted() {
    if(this.$route.query.disabled){
      this.disabled = true
    if (this.$route.query.disabled) {
      this.disabled = true;
    }
  }
  },
};
</script>
<style scoped>
::v-deep .el-tabs__nav-wrap::after {
  background-color: rgba(0, 0, 0, 0) !important;
}
src/views/projectProcess/detail/index.vue
@@ -1,103 +1,104 @@
<template>
  <div class="app-container" v-loading.fullscreen.lock="loading">
    <div class="top">
      <div class="project-title">
        <h2>项目名称:{{detailData.projectName}}</h2>
      </div>
      <div class="project-info">
        <div class="project-info-item"></div>
        <div class="project-info-item">项目代码:{{detailData.projectCode}}</div>
        <div class="project-info-item">
          <div style="color: black">
            <div>中预资金</div>
            <div>市重点项目</div>
  <div class="app-container">
    <div v-loading="loading">
      <div class="top">
        <div class="project-title">
          <h2>项目名称:{{detailData.projectName}}</h2>
        </div>
        <div class="project-info">
          <div class="project-info-item"></div>
          <div class="project-info-item">项目代码:{{detailData.projectCode}}</div>
          <div class="project-info-item">
            <div style="color: black">
              <div>中预资金</div>
              <div>市重点项目</div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="search-warp">
      <div @click="changeTab(1, 'all')" :class="{'item-warm': true, 'all-color': true, 'active': 1 === selectTabId}">全部事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.totalTaskNum}})</span></div>
      <div @click="changeTab(2, 'todo')" :class="{'item-warm': true, 'all-color': true, 'active': 2 === selectTabId}">代办事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.todoTaskNum}})</span></div>
      <div @click="changeTab(3, 'todo')" :class="{'item-warm': true, 'current-color': true, 'active': 3 === selectTabId}">当前环节</div>
      <div @click="changeTab(4, 'remaining')" :class="{'item-warm': true, 'remaining-color': true, 'active': 4 === selectTabId}">剩余事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.remainingTaskNum}})</span></div>
      <div @click="changeTab(5, 'timely')" :class="{'item-warm': true, 'timely-color': true, 'active': 5 === selectTabId}">按时完成(0)</div>
      <div @click="changeTab(6, 'overtime')" :class="{'item-warm': true, 'overtime-color': true, 'active': 6 === selectTabId}">超时事项(0)</div>
      <div @click="changeTab(7, 'willOvertime')" :class="{'item-warm': true, 'willOvertime-color': true, 'active': 7 === selectTabId}">临期事项(0)</div>
      <div @click="changeTab(8, 'urge')" :class="{'item-warm': true, 'urge-color': true, 'active': 8 === selectTabId}">督办事项(0)</div>
    </div>
    <div style="display: flex;justify-content: center;align-items: center;margin-top: 20px">
      <el-form :inline="true" :model="queryParams" class="demo-form-inline">
        <el-form-item label="任务名称">
          <el-input v-model="queryParams.taskName" placeholder="任务名称"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="getList">查询</el-button>
        </el-form-item>
      </el-form>
    </div>
    <div class="table">
      <el-table
        v-loading="tableLoading"
        :data="taskList"
        border
        style="width: 100%">
        <el-table-column
          prop="taskName"
          label="任务名称"
         >
        </el-table-column>
        <el-table-column
          prop="processName"
          label="流程名称"
         >
        </el-table-column>
        <el-table-column
          prop="promoterName"
          label="发起人"
        >
        </el-table-column>
        <el-table-column
          prop="promoterUnitName"
          label="发起单位"
        >
        </el-table-column>
        <el-table-column
          prop="handlerUnitName"
          label="处理单位"
        >
        </el-table-column>
        <el-table-column
          prop="handlerName"
          label="实际处理人"
        >
        </el-table-column>
        <el-table-column
          prop="taskStatus"
          label="任务状态"
        >
        </el-table-column>
        <el-table-column
          fixed="right"
          label="操作"
          width="100">
          <template slot-scope="scope">
            <el-button v-if="scope.row.taskStatus !== '未开始'" @click="goToProcessDetail(scope.row)" type="text" size="small">查看</el-button>
            <el-button v-if="showHandle(scope.row)" @click="goToDo(scope.row)" type="text" size="small">办理</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div class="table" style="margin-top: 15px">
      <el-pagination
        v-if="total > queryParams.pageSize"
        @size-change="getList"
        @current-change="getList"
        :current-page.sync="queryParams.currentPage"
        :page-sizes="[5, 10, 20]"
        :page-size="100"
        layout="sizes, prev, pager, next"
        :total="total">
      </el-pagination>
      <div class="search-warp">
        <div @click="changeTab(1, 'all')" :class="{'item-warm': true, 'all-color': true, 'active': 1 === selectTabId}">全部事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.totalTaskNum}})</span></div>
        <div @click="changeTab(2, 'todo')" :class="{'item-warm': true, 'all-color': true, 'active': 2 === selectTabId}">代办事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.todoTaskNum}})</span></div>
        <div @click="changeTab(3, 'todo')" :class="{'item-warm': true, 'current-color': true, 'active': 3 === selectTabId}">当前环节</div>
        <div @click="changeTab(4, 'remaining')" :class="{'item-warm': true, 'remaining-color': true, 'active': 4 === selectTabId}">剩余事项<span v-if="detailData && detailData.statistics">({{detailData.statistics.remainingTaskNum}})</span></div>
        <div @click="changeTab(5, 'timely')" :class="{'item-warm': true, 'timely-color': true, 'active': 5 === selectTabId}">按时完成(0)</div>
        <div @click="changeTab(6, 'overtime')" :class="{'item-warm': true, 'overtime-color': true, 'active': 6 === selectTabId}">超时事项(0)</div>
        <div @click="changeTab(7, 'willOvertime')" :class="{'item-warm': true, 'willOvertime-color': true, 'active': 7 === selectTabId}">临期事项(0)</div>
        <div @click="changeTab(8, 'urge')" :class="{'item-warm': true, 'urge-color': true, 'active': 8 === selectTabId}">督办事项(0)</div>
      </div>
      <div style="display: flex;justify-content: center;align-items: center;margin-top: 20px">
        <el-form :inline="true" :model="queryParams" class="demo-form-inline">
          <el-form-item label="任务名称">
            <el-input v-model="queryParams.taskName" placeholder="任务名称"></el-input>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="search">查询</el-button>
          </el-form-item>
        </el-form>
      </div>
      <div class="table">
        <el-table
          v-loading="tableLoading"
          :data="taskList"
          border
          style="width: 100%">
          <el-table-column
            prop="taskName"
            label="任务名称"
          >
          </el-table-column>
          <el-table-column
            prop="processName"
            label="流程名称"
          >
          </el-table-column>
          <el-table-column
            prop="promoterUnitName"
            label="发起单位"
          >
          </el-table-column>
          <el-table-column
            prop="promoterName"
            label="发起人"
          >
          </el-table-column>
          <el-table-column
            prop="handlerUnitName"
            label="处理单位"
          >
          </el-table-column>
          <el-table-column
            prop="handlerName"
            label="实际处理人"
          >
          </el-table-column>
          <el-table-column
            prop="taskStatus"
            label="任务状态"
          >
          </el-table-column>
          <el-table-column
            fixed="right"
            label="操作"
            width="100">
            <template slot-scope="scope">
              <el-button v-if="scope.row.taskStatus !== '未开始'" @click="goToProcessDetail(scope.row)" type="text" size="small">查看</el-button>
              <el-button v-if="showHandle(scope.row)" @click="goToDo(scope.row)" type="text" size="small">办理</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <div class="table" style="margin-top: 15px">
        <el-pagination
          @size-change="sizeChange"
          @current-change="pageChange"
          :current-page.sync="queryParams.currentPage"
          :page-sizes="[5, 10, 20]"
          :page-size="100"
          layout="sizes, prev, pager, next"
          :total="total">
        </el-pagination>
      </div>
    </div>
  </div>
</template>
@@ -142,7 +143,9 @@
        if (row.handlerType === "USER") {
          return this.$store.state.user.id === row.handlerId
        } else if (row.handlerType === "DEPT") {
          return this.$store.state.user.id === row.handlerId
          console.log(this.$store.state.user.deptId, "部门id", row.handlerUnitId)
          return this.$store.state.user.deptId === row.handlerUnitId
          // return this.$store.state.user.name === '市发展改革委' || this.$store.state.user.name === '市住建局'
        } else if (row.handlerType === "ROLE") {
          return this.$auth.hasRole(row.handlerUnitName)
        }
@@ -151,47 +154,46 @@
      }
    },
    goToDo(row) {
      // TODO 这里的判断条件根据实际情况设置
      // let params = {
      //   processDefId: row.processDefId,
      //   taskId: row.taskId
      // }
      // getTaskIsAuditing(params).then(res => {
      //
      // })
      // if (this.showHandle(row)) {
        console.log("zhe")
      // 查询该任务是否配置了需要审批
      let params = {
        processDefId: row.processDefId,
        taskId: row.taskId
      }
      getTaskIsAuditing(params).then(res => {
        this.$router.push({
          path: '/flowable/task/myProcess/send/index',
          query: {
            deployId: row.deployId,
            procDefId: row.processDefId,
            processName: row.taskName,
            taskId: row.taskId
            taskId: row.taskId,
            showAuditing: res.data,
            goBackParams: this.queryParams
          }
        })
      // } else {
      //   this.$router.push({
      //     path: '/flowable/task/todo/detail/index',
      //     query: {
      //       taskName: row.taskName,
      //       startUser: row.promoterName,
      //       deployId: row.deployId,
      //       taskId: row.taskId,
      //       procInsId: row.processInsId,
      //       executionId: row.executionId
      //     }
      //   })
      // }
      })
    },
    goToProcessDetail(row) {
      this.$router.push({ path: '/flowable/task/myProcess/detail/index',
        query: {
          procInsId: row.processInsId,
          deployId: row.deployId,
          taskId: row.taskId
          taskId: row.taskId,
          goBackParams: this.queryParams
        }})
    },
    search() {
      this.queryParams.currentPage = 1;
      this.getList()
    },
    sizeChange(pageSize) {
      this.queryParams.pageSize = pageSize;
      this.getList()
    },
    pageChange(pageNum) {
      this.queryParams.currentPage = pageNum;
      this.getList()
    },
    getList() {
      // 获取任务列表
      getProjectProcessDetailTaskList(this.queryParams).then(res => {
src/views/projectProcess/index.vue
@@ -185,7 +185,7 @@
      v-loading="loading"
      :data="projectInfoList"
      @selection-change="handleSelectionChange"
      height="60vh"
      height="100%"
      sortable="custom"
      :show-overflow-tooltip="true">
      <el-table-column type="selection" width="55" align="center"/>
vue.config.js
@@ -7,7 +7,7 @@
const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '射洪项目管理系统' // 网页标题
const name = process.env.VUE_APP_TITLE || '射洪智慧项目管理系统' // 网页标题
const port = process.env.port || process.env.npm_config_port || 80 // 端口