Browse Source

测试报表和审批

fenghy 3 năm trước cách đây
mục cha
commit
5ae216aee6

+ 30 - 1
src/router/views/index.js

@@ -386,5 +386,34 @@ export default [{
             component: () =>
                 import( /* webpackChunkName: "views" */ '@/views/work/process/leave/detail')
         }]
-    },
+    },{
+      path: '/work/process/test',
+      component: Layout,
+      redirect: '/work/process/test/form',
+      children: [{
+        path: 'form/:processDefinitionId',
+        name: '请假流程',
+        meta: {
+          i18n: 'work'
+        },
+        component: () =>
+          import( /* webpackChunkName: "views" */ '@/views/work/process/test/form')
+      }, {
+        path: 'handle/:taskId/:processInstanceId/:businessId',
+        name: '处理请假流程',
+        meta: {
+          i18n: 'work'
+        },
+        component: () =>
+          import( /* webpackChunkName: "views" */ '@/views/work/process/test/handle')
+      }, {
+        path: 'detail/:processInstanceId/:businessId',
+        name: '请假流程详情',
+        meta: {
+          i18n: 'work'
+        },
+        component: () =>
+          import( /* webpackChunkName: "views" */ '@/views/work/process/leave/detail')
+      }]
+    }
 ]

+ 13 - 1
src/views/basicData/customerInformation/index.vue

@@ -29,6 +29,15 @@
                    @refresh-change="refreshChange"
                    @on-load="onLoad"
                    @tree-load="treeLoad">
+          <template slot="menuLeft">
+            <el-button
+              icon="el-icon-printer"
+              size="small"
+              type="primary"
+              @click.stop="goReport('客户资料.ureport.xml')"
+              >报表
+            </el-button>
+          </template>
           <template slot-scope="scope" slot="menu">
             <el-button
                 type="text"
@@ -233,8 +242,11 @@ export default {
         resolve(res.data.data.records);
       });
     },
+    goReport(name){
+      this.$router.push({path: `/myiframe/urlPath?name=preview-${name}&src=${this.website.reportUrl}/preview?_u=blade-${name}`});
+    }
   }
-}
+};
 </script>
 
 <style scoped>

+ 146 - 135
src/views/flow/deploy.vue

@@ -1,154 +1,165 @@
 <template>
   <basic-container>
-    <avue-form ref="form" :option="option" v-model="form" :upload-before="uploadBefore" :upload-after="uploadAfter"/>
+    <avue-form
+      ref="form"
+      :option="option"
+      v-model="form"
+      :upload-before="uploadBefore"
+      :upload-after="uploadAfter"
+    />
   </basic-container>
 </template>
 
 <script>
-  import {deployUpload} from "@/api/flow/flow";
-  import {flowCategory} from "@/util/flow";
+import { deployUpload } from "@/api/flow/flow";
+import { flowCategory } from "@/util/flow";
 
-  export default {
-    data() {
-      return {
-        form: {
-          flowCategory: '',
-          tenantId: '',
-          flowFile: [],
-          file: {},
-        },
-        option: {
-          labelWidth: 120,
-          menuBtn: false,
-          column: [
-            {
-              label: '流程类型',
-              prop: 'flowCategory',
-              type: 'select',
-              dicUrl: `/api/blade-system/dict/dictionary?code=flow`,
-              props: {
-                label: "dictValue",
-                value: "dictKey"
-              },
-              row: true,
-              span: 12,
-              dataType: "number",
-              rules: [
-                {
-                  required: true,
-                  message: '请选择流程类型',
-                  trigger: 'blur'
-                }
-              ]
-            },
-            {
-              label: "流程模式",
-              prop: "flowMode",
-              type: "radio",
-              dicData: [
-                {
-                  label: "通用流程",
-                  value: 1
-                },
-                {
-                  label: "定制流程",
-                  value: 2
-                }
-              ],
-              value: 1,
-              row: true,
-              span: 12,
-              rules: [
-                {
-                  required: true,
-                  message: '请选择流程模式',
-                  trigger: 'blur'
-                }
-              ],
+export default {
+  data() {
+    return {
+      form: {
+        flowCategory: "",
+        tenantId: "",
+        flowFile: [],
+        file: {}
+      },
+      option: {
+        labelWidth: 120,
+        menuBtn: false,
+        column: [
+          {
+            label: "流程类型",
+            prop: "flowCategory",
+            type: "select",
+            dicUrl: `/api/blade-system/dict/dictionary?code=flow`,
+            props: {
+              label: "dictValue",
+              value: "dictKey"
             },
-            {
-              label: "所属租户",
-              prop: "tenantId",
-              type: "tree",
-              multiple: true,
-              dicUrl: "/api/blade-system/tenant/select",
-              props: {
-                label: "tenantName",
-                value: "tenantId"
+            row: true,
+            span: 12,
+            dataType: "number",
+            rules: [
+              {
+                required: true,
+                message: "请选择流程类型",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "流程模式",
+            prop: "flowMode",
+            type: "radio",
+            dicData: [
+              {
+                label: "通用流程",
+                value: 1
               },
-              display: false,
-              row: true,
-              span: 12,
-              rules: [
-                {
-                  required: true,
-                  message: '请选择所属租户',
-                  trigger: 'blur'
-                }
-              ],
+              {
+                label: "定制流程",
+                value: 2
+              }
+            ],
+            value: 1,
+            row: true,
+            span: 12,
+            rules: [
+              {
+                required: true,
+                message: "请选择流程模式",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "所属租户",
+            prop: "tenantId",
+            type: "tree",
+            multiple: true,
+            dicUrl: "/api/blade-system/tenant/select",
+            props: {
+              label: "tenantName",
+              value: "tenantId"
             },
-            {
-              label: '附件上传',
-              prop: 'flowFile',
-              type: 'upload',
-              loadText: '附件上传中,请稍等',
-              span: 24,
-              propsHttp: {
-                res: 'data'
-              },
-              tip: '请上传 bpmn20.xml 标准格式文件',
-              action: '/api/blade-flow/manager/check-upload'
+            display: false,
+            row: true,
+            span: 12,
+            rules: [
+              {
+                required: true,
+                message: "请选择所属租户",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "附件上传",
+            prop: "flowFile",
+            type: "upload",
+            loadText: "附件上传中,请稍等",
+            span: 24,
+            propsHttp: {
+              res: "data"
             },
-          ]
-        }
+            tip: "请上传 bpmn20.xml 标准格式文件",
+            action: "/api/blade-flow/manager/check-upload"
+          }
+        ]
       }
+    };
+  },
+  watch: {
+    "form.flowMode"() {
+      this.$refs.form.option.column.filter(item => {
+        if (item.prop === "tenantId") {
+          item.display = this.form.flowMode === 2;
+        }
+      });
+    }
+  },
+  methods: {
+    uploadBefore(file, done) {
+      this.$message.success("部署开始");
+      this.file = file;
+      done();
     },
-    watch: {
-      'form.flowMode'() {
-        this.$refs.form.option.column.filter(item => {
-          if (item.prop === "tenantId") {
-            item.display = this.form.flowMode === 2;
+    uploadAfter(res, done, loading) {
+      if (!this.form.flowCategory) {
+        this.$message.warning("清先选择流程类型");
+        loading();
+        return false;
+      }
+      if (this.form.flowMode === 2 && !this.form.tenantId) {
+        this.$message.warning("清先选择对应租户");
+        loading();
+        return false;
+      }
+      if (res.success) {
+        deployUpload(
+          flowCategory(this.form.flowCategory),
+          this.form.tenantId ? this.form.tenantId.join(",") : "",
+          [this.file]
+        ).then(res => {
+          const data = res.data;
+          if (data.success) {
+            done();
+          } else {
+            this.$message.error(data.msg);
+            loading();
           }
         });
+      } else {
+        this.$message.warning("请上传 bpmn20.xml 标准格式文件");
+        loading();
+        return false;
       }
-    },
-    methods: {
-      uploadBefore(file, done) {
-        this.$message.success('部署开始');
-        this.file = file;
-        done()
-      },
-      uploadAfter(res, done, loading) {
-        if (!this.form.flowCategory) {
-          this.$message.warning('清先选择流程类型');
-          loading()
-          return false;
-        }
-        if (this.form.flowMode === 2 && !this.form.tenantId) {
-          this.$message.warning('清先选择对应租户');
-          loading();
-          return false;
-        }
-        if (res.success) {
-          deployUpload(
-            flowCategory(this.form.flowCategory),
-            (this.form.tenantId) ? this.form.tenantId.join(",") : "",
-            [this.file]
-          ).then(res => {
-            const data = res.data;
-            if (data.success) {
-              done()
-            } else {
-              this.$message.error(data.msg);
-              loading()
-            }
-          })
-        } else {
-          this.$message.warning('请上传 bpmn20.xml 标准格式文件');
-          loading()
-          return false;
-        }
-      },
     }
   }
+};
 </script>
+<style lang="scss" scoped>
+.basic-container /deep/ .basic-container__card {
+  height: calc(100vh - 125px);
+}
+</style>

+ 16 - 4
src/views/wel/index.vue

@@ -22,21 +22,24 @@
       <index-card title="今日营业" iconName="el-icon-chat-line-round">
         <div slot="content" style="height:17vh" class="operate">
           <div class="operate-item">
-            <div>
+            <div class="item-text">
+              <div class="item-point"></div>
               今日到店
               <p>0</p>
               台次
             </div>
           </div>
           <div class="operate-item">
-            <div>
+            <div class="item-text">
+              <div class="item-point"></div>
               今日到店
               <p>0</p>
               台次
             </div>
           </div>
           <div class="operate-item">
-            <div>
+            <div class="item-text">
+              <div class="item-point"></div>
               今日到店
               <p>0</p>
               台次
@@ -100,10 +103,19 @@ export default {
   .operate-item {
     display: flex;
     align-items: center;
-    div {
+    .item-text {
       display: flex;
       align-items: end;
       font-size: 14px;
+      .item-point {
+        line-height: 14px;
+        width: 14px;
+        height: 14px;
+        border-radius: 2px;
+        background: #ff7d13;
+        margin-right: 4px;
+        margin-bottom: 1px;
+      }
     }
     p {
       font-size: 24px;

+ 108 - 0
src/views/work/process/test/detail.vue

@@ -0,0 +1,108 @@
+<template>
+  <basic-container>
+    <el-form ref="form" :model="form" label-width="80px">
+      <el-row type="flex" class="row-bg" justify="end">
+        <el-form-item>
+          <el-button @click="handleCancel">关闭</el-button>
+        </el-form-item>
+      </el-row>
+      <el-card shadow="hover">
+        <div slot="header">
+          <span>审批信息</span>
+        </div>
+        <el-form-item label="申请人">
+          <el-input :disabled="true" v-model="form.flow.assigneeName" />
+        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="开始时间">
+              <el-input :disabled="true" v-model="form.startTime" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="结束时间">
+              <el-input :disabled="true" v-model="form.endTime" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="请假理由">
+          <el-input :disabled="true" type="textarea" v-model="form.reason" />
+        </el-form-item>
+      </el-card>
+      <el-card shadow="hover">
+        <div slot="header">
+          <span>流程信息</span>
+        </div>
+        <el-row type="flex" class="row-bg">
+          <el-timeline>
+            <el-timeline-item :key="flow.id" :timestamp="flow.createTime" v-for="flow in flowList" placement="top">
+              <el-card shadow="hover">
+                <p>{{flow.assigneeName}} 在 [{{flow.createTime}}] 开始处理 [{{flow.historyActivityName}}] 环节</p>
+                <p v-if="flow.historyActivityDurationTime!==''">任务历时 [{{flow.historyActivityDurationTime}}]</p>
+                <p v-if="flow.comment!==''">批复意见: [{{flow.comment}}]</p>
+                <p v-if="flow.endTime!==''">结束时间: [{{flow.endTime}}]</p>
+              </el-card>
+            </el-timeline-item>
+          </el-timeline>
+        </el-row>
+      </el-card>
+      <el-card shadow="hover">
+        <div slot="header">
+          <span>流程跟踪</span>
+        </div>
+        <el-row type="flex" class="row-bg">
+          <img :src="src" alt="design">
+        </el-row>
+      </el-card>
+    </el-form>
+  </basic-container>
+</template>
+
+<script>
+  import {historyFlowList, leaveDetail} from "@/api/work/process";
+
+  export default {
+    data() {
+      return {
+        businessId: '',
+        processInstanceId: '',
+        src: '',
+        flowList: [],
+        form: {
+          flow:{
+            assigneeName:'',
+          },
+          startTime: '',
+          endTime: '',
+          reason: '',
+        }
+      }
+    },
+    created() {
+      this.init();
+    },
+    methods: {
+      init() {
+        this.processInstanceId = this.$route.params.processInstanceId;
+        this.businessId = this.$route.params.businessId;
+        this.src = `/api/blade-flow/process/diagram-view?processInstanceId=${this.$route.params.processInstanceId}&t=${new Date().getTime()}`;
+        historyFlowList(this.processInstanceId).then(res => {
+          const data = res.data;
+          if (data.success) {
+            this.flowList = data.data;
+          }
+        })
+        leaveDetail(this.businessId).then(res => {
+          const data = res.data;
+          if (data.success) {
+            this.form = data.data;
+          }
+        })
+      },
+      handleCancel() {
+        this.$router.$avueRouter.closeTag();
+        this.$router.push({path: `/work/start`});
+      }
+    }
+  }
+</script>

+ 103 - 0
src/views/work/process/test/form.vue

@@ -0,0 +1,103 @@
+<template>
+  <basic-container>
+    <avue-form :option="option" v-model="form" @submit="handleSubmit"/>
+  </basic-container>
+</template>
+
+<script>
+  import {leaveProcess} from "@/api/work/process";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        option: {
+          group: [
+            {
+              icon: 'el-icon-info',
+              label: '测试基础信息',
+              prop: 'group1',
+              column: [
+                {
+                  label: '审批人员',
+                  prop: 'taskUser',
+                  type: 'select',
+                  dicUrl: `/api/blade-user/user-list`,
+                  props: {
+                    label: "account",
+                    value: "id"
+                  },
+                  span: 24,
+                  rules: [
+                    {
+                      required: true,
+                      message: '请选择审批人员',
+                      trigger: 'blur'
+                    }
+                  ]
+                },
+                {
+                  label: '开始时间',
+                  prop: 'startTime',
+                  type: 'datetime',
+                  valueFormat: 'yyyy-MM-dd HH:mm:ss',
+                  rules: [
+                    {
+                      required: true,
+                      message: '请选择开始时间',
+                      trigger: 'blur'
+                    }
+                  ]
+                },
+                {
+                  label: '结束时间',
+                  prop: 'endTime',
+                  type: 'datetime',
+                  valueFormat: 'yyyy-MM-dd HH:mm:ss',
+                  rules: [
+                    {
+                      required: true,
+                      message: '请选择结束时间',
+                      trigger: 'blur'
+                    }
+                  ]
+                },
+                {
+                  label: '请假理由',
+                  prop: 'reason',
+                  type: 'textarea',
+                  span: 24,
+                  rules: [
+                    {
+                      required: true,
+                      message: '请输入请假理由',
+                      trigger: 'blur'
+                    }
+                  ]
+                },
+              ]
+            },
+          ],
+        }
+      }
+    },
+    methods: {
+      handleSubmit() {
+        const params = {
+          processDefinitionId: this.$route.params.processDefinitionId,
+          ...this.form,
+        };
+        leaveProcess(params).then(resp => {
+          const data = resp.data;
+          if (data.success) {
+            this.$message.success(data.msg);
+            this.$router.$avueRouter.closeTag();
+            this.$router.push({path: `/work/start`});
+          } else {
+            this.$message.error(data.msg || '提交失败');
+          }
+        });
+      }
+    }
+  }
+</script>

+ 170 - 0
src/views/work/process/test/handle.vue

@@ -0,0 +1,170 @@
+<template>
+  <basic-container>
+    <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+      <el-row type="flex" class="row-bg" justify="end">
+        <el-form-item>
+          <el-button type="primary" @click="handleAgree">同意</el-button>
+          <el-button type="danger" @click="handleDisagree">驳回</el-button>
+          <el-button @click="handleCancel">关闭</el-button>
+        </el-form-item>
+      </el-row>
+      <el-card shadow="hover">
+        <div slot="header">
+          <span>审批信息</span>
+        </div>
+        <el-form-item label="申请人">
+          <el-input :disabled="true" v-model="form.flow.assigneeName"/>
+        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="开始时间">
+              <el-input :disabled="true" v-model="form.startTime"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="结束时间">
+              <el-input :disabled="true" v-model="form.endTime"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="请假理由">
+          <el-input :disabled="true" type="textarea" v-model="form.reason"/>
+        </el-form-item>
+        <el-form-item label="批复意见">
+          <el-input type="textarea" v-model="form.comment"/>
+        </el-form-item>
+      </el-card>
+      <el-card shadow="hover">
+        <div slot="header">
+          <span>流程信息</span>
+        </div>
+        <el-row type="flex" class="row-bg">
+          <el-timeline>
+            <el-timeline-item :key="flow.id" :timestamp="flow.createTime" v-for="flow in flowList" placement="top">
+              <el-card shadow="hover">
+                <p>{{flow.assigneeName}} 在 [{{flow.createTime}}] 开始处理 [{{flow.historyActivityName}}] 环节</p>
+                <p v-if="flow.historyActivityDurationTime!==''">任务历时 [{{flow.historyActivityDurationTime}}]</p>
+                <p v-if="flow.comment!==''">批复意见: [{{flow.comment}}]</p>
+                <p v-if="flow.endTime!==''">结束时间: [{{flow.endTime}}]</p>
+              </el-card>
+            </el-timeline-item>
+          </el-timeline>
+        </el-row>
+      </el-card>
+      <el-card shadow="hover">
+        <div slot="header">
+          <span>流程跟踪</span>
+        </div>
+        <el-row type="flex" class="row-bg">
+          <img :src="src" alt="design">
+        </el-row>
+      </el-card>
+    </el-form>
+  </basic-container>
+</template>
+
+<script>
+  import {historyFlowList, leaveDetail} from "@/api/work/process";
+  import {completeTask} from "@/api/work/work";
+
+  export default {
+    data() {
+      return {
+        taskId: '',
+        businessId: '',
+        processInstanceId: '',
+        src: '',
+        flowList: [],
+        form: {
+          flow: {
+            assigneeName: '',
+          },
+          startTime: '',
+          endTime: '',
+          reason: '',
+          comment: '',
+        },
+      }
+    },
+    created() {
+      this.init();
+    },
+    beforeRouteUpdate(to, from, next) {
+      // 在当前路由改变,但是该组件被复用时调用
+      // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
+      // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
+      // 可以访问组件实例 `this`
+      if (to.fullPath !== from.fullPath) {
+        next();
+        this.init();
+      }
+    },
+    methods: {
+      init() {
+        this.taskId = this.$route.params.taskId;
+        this.processInstanceId = this.$route.params.processInstanceId;
+        this.businessId = this.$route.params.businessId;
+        this.src = `/api/blade-flow/process/diagram-view?processInstanceId=${this.$route.params.processInstanceId}&t=${new Date().getTime()}`;
+        historyFlowList(this.processInstanceId).then(res => {
+          const data = res.data;
+          if (data.success) {
+            this.flowList = data.data;
+          }
+        })
+        leaveDetail(this.businessId).then(res => {
+          const data = res.data;
+          if (data.success) {
+            this.form = data.data;
+          }
+        })
+      },
+      handleAgree() {
+        if (!this.form.comment) {
+          this.$message.warning('请先填写批复意见');
+          return;
+        }
+        const params = {
+          taskId: this.taskId,
+          processInstanceId: this.processInstanceId,
+          flag: 'ok',
+          comment: this.form.comment,
+        };
+        completeTask(params).then(res => {
+          const data = res.data;
+          if (data.success) {
+            this.$message.success(data.msg);
+            this.$router.$avueRouter.closeTag();
+            this.$router.push({path: `/work/start`});
+          } else {
+            this.$message.error(data.msg || '提交失败');
+          }
+        })
+      },
+      handleDisagree() {
+        if (!this.form.comment) {
+          this.$message.warning('请先填写批复意见');
+          return;
+        }
+        const params = {
+          taskId: this.taskId,
+          processInstanceId: this.processInstanceId,
+          comment: this.form.comment,
+        };
+        completeTask(params).then(res => {
+          const data = res.data;
+          if (data.success) {
+            this.$message.success(data.msg);
+            this.$router.$avueRouter.closeTag();
+            this.$router.push({path: `/work/start`});
+          } else {
+            this.$message.error(data.msg || '提交失败');
+          }
+        })
+      },
+      handleCancel() {
+        this.$router.$avueRouter.closeTag();
+        this.$router.push({path: `/work/start`});
+      }
+    }
+  }
+</script>