huang_an 2 tahun lalu
induk
melakukan
ea2c9ee72d

+ 7 - 0
src/api/bpm/task.js

@@ -120,3 +120,10 @@ export function apspurchaseplan(data) {
   });
 }
 
+export function outinApproveNotPass(data) {
+  return request({
+    url: '/bpm/outinApprove/notPass',
+    method: 'PUT',
+    data: data
+  });
+}

+ 124 - 0
src/api/warehouseManagement/outin.js

@@ -0,0 +1,124 @@
+import request from '@/utils/request';
+
+export default {
+  //列表
+  list: async (params) => {
+    const res = await request.get('/wms/outin/page', { params });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //列表
+  getAssetNum: async (data) => {
+    const res = await request.post('/wms/outin/getAssetNum', data);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //保存
+  save: async (data) => {
+    const res = await request.post('/wms/outin/save', data);
+    if (res.data.code == 0) {
+      return res.data;
+    }
+  },
+  //删除
+  delete: async (data) => {
+    const res = await request.delete('/wms/outin/delete', data);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //出库实时库存
+  getRealTimeInventory: async (params) => {
+    const res = await request.get(`/wms/outin/getRealTimeInventory`, {
+      params
+    });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //出库实时库存
+  pageeLedger: async (params) => {
+    const res = await request.get(`/wms/outin/getOutStock`, {
+      params
+    });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //出库物品实时库存
+  getoutDetail: async (params) => {
+    const res = await request.get(`/wms/outin/getOutDetail`, {
+      params
+    });
+    if (res.data.code == 0) {
+      return res.data;
+    }
+  },
+  //详情
+  getById: async (id) => {
+    const res = await request.get(`/wms/outin/getById/${id}`);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //出入库单-新增入库单信息
+  addInOut: async (data) => {
+    const res = await request.post('/wms/inout/addInOut', data);
+    if (res.data.code == 0) {
+      return res.data;
+    }
+  },
+  //列表
+  pageWms: async (params) => {
+    const res = await request.get('/wms/inout/page', { params });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+
+  //入库详情
+  getWms: async (id) => {
+    const res = await request.get(`/wms/inout/getInfoById/${id}`);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //库存台账-基本信息
+  getBasicInformation: async (categoryId) => {
+    const res = await request.get(
+      `/wms/outin/getBasicInformation/${categoryId}`
+    );
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+
+  //库存台账-库存明细
+
+  getInventoryDetails: async (params) => {
+    const res = await request.get(`/wms/outin/getInventoryDetails`, {
+      params
+    });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //库存台账-库存明细-物料维度
+
+  getMaterielDetails: async (params) => {
+    const res = await request.get(`/wms/outin/getMaterielDetails`, {
+      params
+    });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  outinApprove: async (params) => {
+    const res = await request.post(`/bpm/outinApprove/submit`, params);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  }
+};

+ 38 - 0
src/components/StatusStep/common.vue

@@ -0,0 +1,38 @@
+<template>
+  <baseComp :statusList="statusList" :activeCode="activeCode" />
+</template>
+
+<script>
+  import baseComp from './index.vue';
+  // import { auditStatus } from '@/utils/dict/common';
+
+  // 一般统一审核流程
+  export default {
+    components: {
+      baseComp
+    },
+    props: {
+      activeCode: {
+        type: Number,
+        default: 0
+      }
+    },
+    data() {
+      return {};
+    },
+    computed: {
+      statusList() {
+        const base = [{ label: '创建' }, { code: 0, label: '待审核' }];
+        console.log(this.activeCode, 'api/outInWarehouse/select/detail');
+
+        if (this.activeCode == 1) {
+          base.push({ code: 1, label: '已完成', activeColor: '#157a2c' });
+        } else {
+          base.push({ code: 2, label: '已驳回', activeColor: '#cc3300' });
+        }
+        console.log(base, 'base');
+        return base;
+      }
+    }
+  };
+</script>

+ 5 - 0
src/components/StatusStep/dict.js

@@ -0,0 +1,5 @@
+export const cm_workOrderStatus = [
+  { code: 0, label: '待审核' },
+  { code: 1, label: '已完成' },
+  { code: 2, label: '已驳回' }
+];

+ 152 - 0
src/components/StatusStep/index.vue

@@ -0,0 +1,152 @@
+<template>
+  <div class="status-step">
+    <div class="el-steps el-steps--horizontal">
+      <div
+        class="el-step is-horizontal is-center"
+        style="flex-basis: 25%; color: rgb(0, 0, 0); margin-right: 0px"
+        v-for="(item, index) in statusList"
+        :key="index"
+      >
+        <!-- 未处理 -->
+        <div class="el-step__head is-wait-a">
+          <div
+            class="el-step__line"
+            :class="{
+              Processing: activeIndex == index,
+              Done: activeIndex > index
+            }"
+          >
+            <i
+              class="el-step__line-inner"
+              style="transition-delay: 0ms; border-width: 0px; width: 0%"
+            ></i>
+          </div>
+          <div class="el-step__icon is-text">
+            <div
+              class="el-step__icon-inner"
+              :style="
+                activeIndex == index
+                  ? `backgroundColor: ${item.activeColor} !important`
+                  : ''
+              "
+              :class="{
+                Processing: activeIndex == index,
+                Done: activeIndex > index
+              }"
+            ></div>
+          </div>
+        </div>
+
+        <div class="el-step__main">
+          <div
+            class="el-step__title is-wait"
+            :style="
+              activeIndex == index
+                ? `color: ${item.activeColor} !important`
+                : ''
+            "
+            :class="{
+              Processing_text: activeIndex == index,
+              Done_text: activeIndex > index
+            }"
+          >
+            {{ item.label }}
+            <!-- {{ urgeshow(item.nodeName) }} -->
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { cm_workOrderStatus } from './dict';
+  export default {
+    props: {
+      activeCode: {
+        type: Number,
+        default: 0
+      },
+      //默认工单审核状态
+      statusList: {
+        type: Array,
+        default: () =>
+          cm_workOrderStatus.slice(0, cm_workOrderStatus.length - 2)
+      }
+    },
+    computed: {
+      activeIndex() {
+        const index = this.statusList.findIndex(
+          (i) => i.code === this.activeCode
+        );
+        console.log(index, 'index');
+        return index === -1 ? 0 : index;
+      }
+    },
+    data() {
+      return {};
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  @import './oaa.scss';
+
+  .status-step {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+
+    .el-step__title {
+      white-space: nowrap;
+    }
+    .el-steps {
+      width: 500px;
+    }
+  }
+
+  // .el-step__icon.is-text {
+  //   border: none !important;
+  // }
+
+  //
+  .Processing {
+    background: #3196fb !important;
+  }
+
+  .Processing_text {
+    color: #3196fb !important;
+  }
+
+  .Done {
+    background: #157a2c !important;
+  }
+
+  .Done_text {
+    color: #157a2c !important;
+  }
+
+  .Stop {
+    background: #cc3300 !important;
+  }
+
+  .Stop_text {
+    color: #cc3300 !important;
+  }
+
+  .el-step__icon-inner {
+    width: 22px;
+    height: 22px;
+    background-color: #d0e4d5;
+    border-radius: 50%;
+  }
+  .el-step__title.is-wait {
+    color: #9e9e9e;
+  }
+
+  .el-step__title {
+    font-size: 14px;
+    font-weight: bold;
+    color: #c0c4cc;
+  }
+</style>

+ 532 - 0
src/components/StatusStep/oaa.scss

@@ -0,0 +1,532 @@
+* {
+  margin: 0;
+  padding: 0;
+}
+
+.zw-criterion-normal {
+  padding: 20px;
+  background: #fff;
+  margin-top: 10px;
+}
+
+.zw-tags {
+  padding-left: 20px;
+  background: #fff;
+
+  .zw-tags-el {
+    margin-left: 10px;
+    cursor: pointer;
+  }
+}
+
+.zw-criterion-search-more {
+  margin-left: 10px;
+}
+
+.zw-table-header {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 10px;
+}
+
+.zw-table-footer {
+  display: flex;
+  justify-content: space-between;
+  margin-top: 10px;
+}
+
+.zw-table-countinfo-link {
+  display: inline-block;
+  height: 32px;
+  line-height: 32px;
+  color: #6e6e6e;
+  font-size: 14px;
+}
+
+.links {
+  margin-left: 20px;
+}
+
+.zw-table-pagebar {
+  display: flex;
+  align-items: center;
+}
+
+.zw-table-pagebar span {
+  margin-right: 10px;
+  font-weight: normal;
+  color: #606266;
+  font-size: 13px;
+}
+
+// 表格
+.zw-page-table {
+  background: #fff;
+}
+
+.data-tab .el-table__header-wrapper {
+  background-color: #f0f3f3;
+}
+
+.data-tab .el-table thead {
+  color: #000;
+}
+
+.data-tab .el-table--enable-row-hover .el-table__body tr:hover > td {
+  background-color: #f0f3f3 !important;
+}
+
+.data-tab .line {
+  width: 1px;
+  height: 14px;
+  background: #dedede;
+  display: inline-block;
+  margin: 0 5px;
+}
+
+/* 我的操作区 */
+.my-operate {
+  line-height: 33px;
+  height: 33px;
+  margin: 10px 20px 0;
+}
+
+.my-operate a {
+  margin-right: 20px;
+  font-size: 14px;
+}
+
+.more {
+  color: #157a2c !important;
+  padding-left: 30px;
+}
+
+.el-form-item {
+  margin-bottom: 5px;
+}
+
+// 详情页
+.head {
+  background-color: #fff;
+}
+
+.head .ask_for_title {
+  padding-bottom: 8px;
+  border-bottom: 1px solid #ccc;
+  font-weight: bold;
+  display: flex;
+  align-items: center;
+}
+
+.head .odd-num {
+  color: #333333;
+  font-size: 14px;
+  font-weight: normal;
+  margin-left: 8px;
+}
+
+// tab切换框
+.switch {
+  padding: 10px 0 0;
+  display: flex;
+  justify-content: space-between;
+}
+
+.switch_left ul {
+  list-style-type: none;
+  display: flex;
+  padding: 0;
+  margin: 0;
+}
+
+.switch_left ul li {
+  min-width: 80px;
+  padding: 0 10px;
+  text-align: center;
+  background: #dfdfdf;
+  color: #333;
+  font-size: 14px;
+  height: 36px;
+  line-height: 32px;
+  margin-right: 5px;
+  border-top: 4px solid #dfdfdf;
+  cursor: pointer;
+}
+
+.switch_left ul .active {
+  background: #fff;
+  border-top: 4px solid #157a2c;
+  color: #157a2c;
+}
+
+// 详情
+.content {
+  background: #fff;
+  padding: 20px;
+}
+
+.flow .flow-left {
+  width: 156px;
+  height: 70px;
+  border: 1px dashed #ccc;
+  padding: 10px;
+}
+
+.flow-left-item {
+  display: flex;
+  align-items: flex-end;
+}
+
+.flow-left-item .block {
+  width: 16px;
+  height: 16px;
+  background-color: #ccc;
+}
+
+.flow-left-item span {
+  font-size: 13px;
+  color: #333;
+  margin-left: 5px;
+}
+
+.flow-left-item .block1 {
+  background-color: #3196fb;
+}
+
+.flow-left-item .block2 {
+  background-color: #157a2c;
+}
+
+.flow-left-item .block3 {
+  background-color: #cc3300;
+}
+
+.flow .row {
+  margin-top: 13px;
+}
+
+.flow {
+  border-bottom: 1px solid #f2f2f2;
+  padding-bottom: 8px;
+}
+
+// 详细信息
+.detailed {
+  margin-top: 30px;
+}
+
+.detailed-item label {
+  font-weight: bold;
+  color: #333;
+  font-size: 14px;
+}
+
+.detailed-item span {
+  color: #333;
+  font-size: 14px;
+  margin-left: 8px;
+}
+
+.detailed .detailed-item {
+  margin-bottom: 15px;
+  display: flex;
+  align-items: unset;
+}
+
+.detailed .detailed-item table {
+  margin-left: 10px;
+}
+
+.detailed-item .annex {
+  color: #3300ff !important;
+  text-decoration: underline;
+  display: block;
+  margin-bottom: 8px;
+}
+
+.no_data {
+  line-height: 60px;
+  color: #909399;
+  margin: auto;
+  text-align: center;
+}
+
+.carry-time {
+  color: #999;
+  font-size: 12px;
+  font-weight: bold;
+}
+
+.el-step__icon-inner {
+  width: 22px;
+  height: 22px;
+  background-color: #d0e4d5;
+  border-radius: 50%;
+}
+.el-step__title.is-wait {
+  color: #9e9e9e;
+}
+
+.el-step__title {
+  font-size: 14px;
+  font-weight: bold;
+  color: #c0c4cc;
+}
+
+// 流程日志列表
+.el-timeline-title {
+  display: flex;
+  align-items: baseline;
+}
+
+.section {
+  padding: 10px;
+  background: #f2f2f2;
+  min-width: 400px;
+  margin-top: 5px;
+}
+
+.section-item {
+  margin-bottom: 10px;
+}
+
+.section-item label {
+  min-width: 60px;
+  font-size: 14px;
+  font-weight: 700;
+  text-align: right;
+  color: #666666;
+  margin-right: 5px;
+  display: inline-block;
+}
+
+.section-item span {
+  font-size: 14px;
+  color: #666666;
+}
+
+.el-timeline-item__wrapper {
+  padding-left: 166px;
+}
+
+.el-timeline-item__content {
+  padding-top: 3px;
+}
+
+.el-timeline-item__tail {
+  border-right: 2px solid #157a2c;
+  border-left: none;
+  padding-right: 13px;
+  width: 145px;
+  text-align: right;
+}
+
+.el-timeline .el-timeline-item:last-child .el-timeline-item__tail {
+  display: inline-block;
+  border: none;
+}
+
+.el-timeline-item__node--normal {
+  left: 140px;
+  width: 16px;
+  height: 16px;
+  background-color: #157a2c;
+}
+
+.el-timeline-node-name {
+  font-size: 14px;
+  font-weight: bold;
+}
+
+.el-timeline-item__timestamp {
+  font-size: 12px;
+}
+
+.el-timeline-node-name span {
+  padding: 0 8px;
+  color: #cccccc;
+}
+
+.square {
+  border-radius: 0;
+}
+
+.triangle {
+  border-radius: 0;
+  width: 0;
+  height: 0;
+  border-left: 8px solid transparent;
+  border-right: 8px solid transparent;
+  border-bottom: 16px solid #157a2c;
+  background-color: #fff;
+}
+
+.un_triangle {
+  border-radius: 0;
+  width: 0;
+  height: 0;
+  border-left: 8px solid transparent;
+  border-right: 8px solid transparent;
+  border-bottom: 16px solid red;
+  background-color: #fff;
+}
+
+// 勘查单
+.doing_title {
+  margin-bottom: 12px;
+  margin-top: 20px;
+}
+
+.doing_title span {
+  height: 20px;
+  font-size: 16px;
+  border-left: 4px solid #157a2c;
+  padding-left: 10px;
+  line-height: 20px;
+  font-weight: bold;
+}
+
+.el-step__icon.is-text {
+  border: none !important;
+}
+
+//
+.Processing {
+  background: #3196fb !important;
+}
+
+.Processing_text {
+  color: #3196fb !important;
+}
+
+.Done {
+  background: #157a2c !important;
+}
+
+.Done_text {
+  color: #157a2c !important;
+}
+
+.Stop {
+  background: #cc3300 !important;
+}
+
+.Stop_text {
+  color: #cc3300 !important;
+}
+
+//
+.operation {
+  float: right;
+}
+
+.interval {
+  margin-bottom: 10px;
+}
+
+.zw-data-table {
+  .senior {
+    color: #157a2c !important;
+  }
+
+  .odd-num {
+    text-decoration: underline;
+  }
+
+  .time {
+    color: #aaaaaa;
+  }
+
+  td {
+    vertical-align: top;
+  }
+
+  .bill-no {
+    color: #aaaaaa;
+  }
+}
+
+.zw-tags {
+  padding: 0 20px 16px;
+}
+
+.add-css {
+  .choice-but {
+    margin-left: 10px;
+  }
+
+  .mechanism .el-form-item__content {
+    display: flex;
+  }
+
+  .mechanism .el-select {
+    margin-right: 5px;
+  }
+
+  .el-icon-map-location {
+    color: #157a2c;
+    font-size: 20px;
+    margin-top: 5px;
+    margin-left: 5px;
+  }
+
+  .account th > .cell {
+    display: block;
+  }
+}
+
+.page-footer-btn {
+  margin-top: 20px;
+  text-align: center;
+}
+
+.dialog-form-footer {
+  padding-bottom: 5px;
+  padding-top: 10px;
+  margin-bottom: 0;
+  text-align: right;
+}
+
+.table-list {
+  background-color: #fff;
+  margin-top: 10px;
+}
+
+.table-add {
+  margin: 20px 0;
+}
+
+.mb10 {
+  margin-bottom: 10px;
+}
+
+.down_link {
+  text-decoration: underline;
+  color: #0000ee;
+
+  &:visited {
+    color: #999;
+  }
+
+  &:hover {
+    text-decoration: underline;
+    color: #000000;
+  }
+}
+
+.repair_infoLogs .el-step:last-of-type .el-step__line {
+  display: block !important;
+}
+.repair_infoLogs .el-steps:last-child .el-step__line {
+  display: none !important;
+}
+
+.el-textarea .el-input__count {
+  background: rgba(255, 255, 255, 0);
+}
+
+// 审批人下拉选择超出
+.el-select-dropdown {
+  max-height: 350px !important;
+  overflow-y: auto !important;
+}

+ 21 - 0
src/utils/dict/common.js

@@ -0,0 +1,21 @@
+// 审核状态
+export const auditStatus = [
+  { code: 0, label: '待审核', class: 'ele-text-primary' },
+  { code: 1, label: '已审核', class: 'ele-text-primary' },
+  { code: 2, label: '已驳回', class: 'ele-text-danger' }
+];
+
+// 是否
+export const isOrNot = [
+  { code: 1, label: '是' },
+  { code: 0, label: '否' }
+];
+
+export const cm_workOrderStatus = [
+  { code: 0, label: '待接收' },
+  { code: 1, label: '执行中' },
+  { code: 2, label: '待审核' },
+  { code: 3, label: '完成' },
+  { code: 4, label: '已撤回' },
+  { code: 5, label: '已驳回' }
+];

+ 28 - 0
src/utils/dict/dictMixin.js

@@ -0,0 +1,28 @@
+import dictEnum from '@/enum/dict'
+import { mapGetters } from 'vuex'
+const dictMixin = {
+    data() {
+      return {
+        
+      };
+    },
+    computed:{
+        ...mapGetters(['dict', 'getDict']),
+      },
+    methods: {
+        echoDict(dictName,value){
+            let list = this.dict[dictEnum[dictName]] || []
+            let e = list.find(n=>{
+                n.dictCode == value
+            })
+            if(e){
+                return e.dictValue
+            }else {
+                return ''
+            }
+        }
+    }
+  };
+  
+  export default dictMixin;
+  

+ 38 - 0
src/utils/dict/index.js

@@ -0,0 +1,38 @@
+export * from './common';
+export * from './patrol';
+export * from './warehouse';
+export * from './warehouseDefinition';
+
+// 字典
+
+//获取字典项
+export const useDict = (dict) => {
+  if (!dict || !Array.isArray(dict)) {
+    console.error('请传入正确的字典');
+    return '';
+  }
+  return (code) => {
+    return dict.find((item) => (item && item.code) === code) || {};
+  };
+};
+//获取字典label
+export const useDictLabel = (dict) => {
+  if (!dict || !Array.isArray(dict)) {
+    console.error('请传入正确的字典');
+    return '';
+  }
+  return (code) => {
+    // console.log(code, 'label');
+    const obj = dict.find((item) => (item && item.code) == code);
+    return obj && obj.label;
+  };
+};
+//获取字典label
+export const useDictLabelFilter = (code, dict) => {
+  if (!dict || !Array.isArray(dict)) {
+    console.error('请传入正确的字典');
+    return '';
+  }
+  const obj = dict.find((item) => (item && item.code) === code);
+  return obj && obj.label;
+};

+ 18 - 0
src/utils/dict/patrol.js

@@ -0,0 +1,18 @@
+// 巡点检
+
+// 巡点检事项状态
+export const patrolMatterStatus = [
+  { code: 0, label: '缺陷' },
+  { code: 1, label: '正常' },
+  { code: null, label: '未处理' }
+]
+// 审批配置状态
+export const approverConfigStatus = [
+  { code: '0', label: '启用' },
+  { code: '1', label: '禁用' }
+]
+// 枚举值类型
+export const enumTypeList = [
+  { code: 1, label: '数字' },
+  { code: 2, label: '字符串' }
+]

+ 117 - 0
src/utils/dict/warehouse.js

@@ -0,0 +1,117 @@
+// =====================仓储管理
+
+export const warehousingType = [
+  { code: 3, label: '物料', key: 'WULIAO' },
+  { code: 4, label: '产品', key: 'CHANPIN' },
+  {
+    code: 5,
+    label: '周转车',
+    key: 'ZHOUZHUANCHE'
+  },
+  { code: 2, label: '舟皿', key: 'ZHOUMIN' },
+  {
+    code: 1,
+    label: '设备',
+    key: 'SHENGCHANSHEBEI'
+  },
+  { code: 6, label: '模具', key: 'MOJU' },
+  {
+    code: 7,
+    label: '备品备件',
+    key: 'BEIPINBEIJIAN'
+  }
+];
+
+// export const wh_assetDict = [
+//   { label: '物料', type: 'w', code: 'WULIAO' },
+//   // {  label: "产品", type: "c", code:'CHANPIN' },
+//   { label: '周转车', type: '2', code: 'ZHOUZHUANCHE' },
+//   { label: '舟皿', type: '1', code: 'ZHOUMIN' },
+//   { label: '设备', type: '0', code: 'SHENGCHANSHEBEI' },
+//   { label: '模具', type: '3', code: 'MOJU' },
+//   { label: '备品备件', type: '4', code: 'BEIPINBEIJIAN' }
+// ]
+export const sceneState = [
+  { code: 1, label: '生产入库' },
+  { code: 2, label: '采购入库' },
+  { code: 3, label: '赠送入库' },
+  { code: 4, label: '借用入库' },
+  // { code: 5, label: '退还入库' },
+  { code: 6, label: '其他入库' }
+];
+export const outputSceneState = [
+  { code: 1, label: '退供出库' },
+  { code: 2, label: '调拨出库' },
+  { code: 3, label: '销售出库' },
+  { code: 4, label: '领用出库' },
+  { code: 5, label: '报废出库' }
+];
+// 紧急状态
+export const emergencyState = [
+  { code: 1, label: '普通', color: 'red' },
+  { code: 2, label: '重要', color: 'blue' },
+  { code: 3, label: '紧急', color: 'red' }
+];
+export const materialType = [
+  { code: 1, label: '混炼料' },
+  { code: 2, label: '混合料' }
+];
+
+export const inputStatus = [
+  { code: 1, label: '入库' },
+  { code: 2, label: '出库' }
+];
+// 盘点类型
+export const wh_checkStatus = [
+  { code: 1, label: '库内' },
+  { code: 2, label: '库外' }
+];
+export const allocationType = [
+  { code: 1, label: '库内调拨' },
+  { code: 2, label: '库外调拨' }
+];
+export const allocationStatusDict = [
+  { code: 1, label: '空置', color: 'blue' },
+  { code: 2, label: '在用', color: 'green' },
+  { code: 3, label: '已满', color: 'red' },
+  { code: 4, label: '失效', color: 'grey' }
+];
+
+// 计划周期类型
+export const wh_cycleTypeStauts = [
+  { code: 1, label: '周期计划' },
+  { code: 2, label: '临时计划' }
+];
+
+// 是否锁库盘点(0:否;1:是;)盘点独有字段
+export const wh_isTreasuryLock = [
+  { code: false, label: '否' },
+  { code: true, label: '是' }
+];
+// 计划状态
+export const wh_planStatus = [
+  { code: 0, label: '未派单' },
+  { code: 4, label: '待审核' },
+  { code: 5, label: '已审核' },
+  { code: 6, label: '派单中' },
+  { code: 1, label: '已派单' },
+  { code: 2, label: '已完成' },
+  { code: 3, label: '已撤回' }
+];
+export const wh_planStatusEnum = [
+  { code: 'WEIPAIDAN', label: '未派单' },
+  { code: 'YIPAIDAN', label: '已派单' },
+  { code: 'YIWANCHENG', label: '已完成' },
+  { code: 'YICHEHUI', label: '已撤回' },
+  { code: 'DAISHENHE', label: '待审核' },
+  { code: 'YISHENHE', label: '已审核' },
+  { code: 'PAIDANZHONG', label: '派单中' }
+];
+// 盘点资产状态
+export const wh_equStatus = [
+  { code: 0, label: '待盘点', color: '' },
+  { code: 1, label: '盘亏', color: '#D9001B' },
+  { code: 2, label: '盘损', color: '#F59A23' },
+  { code: 3, label: '盘盈', color: '#70B603' },
+  { code: 4, label: '正常', color: '' }
+];

+ 41 - 0
src/utils/dict/warehouseDefinition.js

@@ -0,0 +1,41 @@
+// 仓库定义
+
+export const warehouseDefinition_areaType = [
+  { code: 1, label: "原料库" },
+  { code: 2, label: "成品库" },
+  { code: 3, label: "设备库" },
+  { code: 4, label: "舟皿库" },
+  { code: 5, label: "模具库" },
+  { code: 6, label: "周转车库" },
+  { code: 7, label: "不良品库" },
+  { code: 8, label: "备品备件库" },
+];
+export const warehouseDefinition_areaAttribute = [
+  { code: 1, label: "常温" },
+  { code: 2, label: "冷藏" },
+  { code: 3, label: "恒温" },
+  { code: 4, label: "低温" },
+];
+//仓库状态定义
+export const warehouseDefinition_statusList = [
+  { code: 0, label: "失效" },
+  { code: 1, label: "生效" },
+];
+export const warehouseDefinition_inventoryList = [
+  { code: 1, label: "物料仓" },
+  { code: 2, label: "产品仓" },
+  { code: 3, label: "设备仓" },
+  { code: 4, label: "模具仓" },
+  { code: 5, label: "舟皿仓" },
+  { code: 6, label: "备品备件仓" },
+];
+export const warehouseDefinition_locationStatus = [
+  { code: 1, label: "空置", color: "rgba(202, 249, 130, 1)" },
+  { code: 2, label: "在用", color: "rgba(129, 211, 248, 1)" },
+  { code: 3, label: "已满", color: "rgba(255, 14, 14, 1)" },
+  { code: 4, label: "失效", color: "rgba(215, 215, 215, 1)" },
+];
+export const warehouseDefinition_isRegular = [
+  { code: 1, label: "是" },
+  { code: 0, label: "否" },
+];

+ 87 - 0
src/views/bpm/handleTask/components/inoutBound/common.js

@@ -0,0 +1,87 @@
+export const tableHeader = (selectEquiType) => {
+  switch (+selectEquiType) {
+    case 3:
+      return [{ label: '牌号', prop: 'brandNum' }];
+    case 8:
+      return [
+        { label: '型号', prop: 'modelType' },
+        { label: '规格', prop: 'specification' }
+      ];
+    case 4:
+      return [
+        { label: '牌号', prop: 'brandNum' },
+        { label: '型号', prop: 'modelType' }
+      ];
+    case 9:
+      return [
+        { label: '牌号', prop: 'brandNum' },
+        { label: '型号', prop: 'modelType' }
+      ];
+    case 5: //'周转车'
+      return [
+        { label: '规格', prop: 'specification' },
+        {
+          label: '材质',
+          prop: 'texture',
+          formatter(row) {
+            if (!row?.extendField) return '';
+            const extendField = JSON.parse(row.extendField);
+            return extendField.texture;
+          }
+        },
+        {
+          label: '长宽高',
+          prop: '',
+          formatter(row) {
+            if (!row?.extendField) return '';
+            const extendField = JSON.parse(row.extendField);
+            return `${extendField.length || '-'}*${extendField.width || '-'}*${
+              extendField.high || '-'
+            }`;
+          }
+        }
+      ];
+    case 2: //'舟皿'
+      return [
+        { label: '规格', prop: 'specification' },
+        { label: '型号', prop: 'modelType' },
+        {
+          label: '长宽高',
+          prop: '',
+          formatter(row) {
+            if (!row?.extendField) return '';
+            const extendField = JSON.parse(row.extendField);
+            return `${extendField.length || '-'}*${extendField.width || '-'}*${
+              extendField.high || '-'
+            }`;
+          }
+        }
+      ];
+    case 1: //'设备'
+      return [
+        { label: '型号', prop: 'modelType' },
+        { label: '规格', prop: 'specification' }
+      ];
+    case 6: //'模具'
+      return [
+        { label: '牌号', prop: 'brandNum' },
+        { label: '型号', prop: 'modelType' },
+        {
+          label: '收缩系数',
+          prop: '',
+          formatter(row) {
+            if (!row?.extendField) return '';
+            const extendField = JSON.parse(row.extendField);
+            return extendField.shrinkageCoefficient;
+          }
+        }
+      ];
+    case 7: //'备品备件'
+      return [
+        { label: '规格', prop: 'specification' },
+        { label: '型号', prop: 'modelType' }
+      ];
+  }
+
+  return [];
+};

+ 848 - 0
src/views/bpm/handleTask/components/inoutBound/detailDialog.vue

@@ -0,0 +1,848 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <div>
+        <div class="content-detail">
+          <header-title title="基本信息" size="16px"></header-title>
+
+          <div class="mt20">
+            <el-form label-width="120px">
+              <el-col :span="8">
+                <el-form-item label="入库单:">
+                  <span>{{ infoData.bizNo }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="入库物品类型:">
+                  <span>{{ handleAssetType(extInfo.assetType) }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="入库场景:">
+                  <span>{{ getSceneState(infoData.bizType) }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="销售订单:">
+                  <span>{{ extInfo.documentSource }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="权属部门:">
+                  <span>{{ extInfo.deptName }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="入库登记人:">
+                  <span>{{ extInfo.createUserName }}</span>
+                </el-form-item>
+              </el-col>
+              <!-- <el-col :span="8">
+                <el-form-item label="创建时间:">
+                  <span>{{ infoData.createTime }}</span>
+                </el-form-item>
+              </el-col> -->
+              <el-col :span="8">
+                <el-form-item label="入库时间:">
+                  <span>{{ infoData.createTime }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="状态:">
+                  <span>{{ getAuditStatus(infoData.verifyStatus) }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="审核人:">
+                  <span>{{ infoData.verifyName }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8" v-if="infoData.bizType == 2">
+                <el-form-item label="客户:">
+                  <span>{{ infoData.clientName }}</span>
+                </el-form-item>
+              </el-col>
+              <!-- <el-col :span="8" v-if="infoData.bizType == 2">
+                <el-form-item label="客户代码:">
+                  <span>{{ infoData.clientCode }}</span>
+                </el-form-item>
+              </el-col> -->
+              <el-col :span="8" v-if="infoData.bizType == 2">
+                <el-form-item label="供应商:">
+                  <span>{{ extInfo.supplierName }}</span>
+                </el-form-item>
+              </el-col>
+              <!-- <el-col :span="8" v-if="infoData.bizType != 2">
+                <el-form-item label="供应商代码:">
+                  <span>{{ extInfo.supplierCode }}</span>
+                </el-form-item>
+              </el-col> -->
+              <el-col :span="8">
+                <el-form-item label="送货人:">
+                  <span>{{ infoData.fromUser }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="送货人联系方式:">
+                  <span>{{ extInfo.deliveryPhone }}</span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="附件:">
+                  <!-- <el-link
+                    type="primary"
+                    v-for="(item, index) in infoData.contentImage"
+                    @click="contentImageDownload(item)"
+                    :key="item.name"
+                    >{{ item.name }}</el-link
+                  > -->
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="备注:">
+                  <span>{{ infoData.remark }}</span>
+                </el-form-item>
+              </el-col>
+            </el-form>
+          </div>
+        </div>
+        <div class="content-detail mt20">
+          <header-title title="物品信息" size="16px"></header-title>
+
+          <div class="mt20">
+            <div class="mt10">
+              <el-table
+                ref="multipleTable"
+                :data="warehousingMaterialList"
+                tooltip-effect="dark"
+                :key="infoData.assetType"
+                style="width: 100%"
+                stripe
+                :header-cell-style="rowClass"
+              >
+                <el-table-column label="序号" type="index" width="50">
+                </el-table-column>
+                <el-table-column
+                  label="编码"
+                  prop="categoryCode"
+                  align="center"
+                  width="150"
+                ></el-table-column>
+                <el-table-column
+                  label="名称"
+                  align="center"
+                  width="170"
+                  prop="name"
+                ></el-table-column>
+                <el-table-column
+                  v-for="(item, index) in tableHeader"
+                  :key="index"
+                  align="center"
+                  :label="item.label"
+                  width="150"
+                  :prop="item.prop"
+                >
+                  <template slot-scope="{ row }">
+                    <template v-if="item.formatter">{{
+                      item.formatter(row)
+                    }}</template>
+                    <template v-else>{{ row[item.prop] }}</template>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="批次号"
+                  prop="batchNo"
+                  width="70"
+                  align="center"
+                >
+                </el-table-column>
+                <el-table-column
+                  label="最小包装单元"
+                  align="center"
+                  prop="minPackingCount"
+                  width="300"
+                >
+                  <!-- <el-table-column label="" prop="measurementUnit" width="100">
+                    <template slot-scope="{ row, $index }">
+                      {{ row.minPackingCount }}
+                    </template>
+                  </el-table-column> -->
+                  <el-table-column
+                    label=""
+                    prop="measurementUnit"
+                    align="center"
+                    width="110"
+                  >
+                    <template slot-scope="{ row, $index }">
+                      {{ row.minPackingCount }} {{ row.measuringUnit }} /{{
+                        row.packingUnit
+                      }}
+                    </template>
+                  </el-table-column>
+                </el-table-column>
+
+                <el-table-column
+                  label="包装数量"
+                  prop="packingCount"
+                  width="100"
+                  align="center"
+                >
+                  <template slot-scope="{ row, $index }">
+                    {{ row.packingCount }} {{ row.packingUnit }}
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="计量数量"
+                  prop="batchNo"
+                  width="100"
+                  align="center"
+                >
+                  <template slot-scope="{ row, $index }">
+                    <template>
+                      {{ row.minPackingCount * row.packingCount }}
+                    </template>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="计量单位"
+                  prop="batchNo"
+                  width="100"
+                  align="center"
+                >
+                  <template slot-scope="{ row, $index }">
+                    <template>
+                      {{ row.measuringUnit }}
+                    </template>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="重量"
+                  prop="count"
+                  width="100"
+                  align="center"
+                >
+                  <template slot-scope="{ row, $index }">
+                    {{ row.weight }}
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="重量单位"
+                  prop="count"
+                  width="100"
+                  align="center"
+                >
+                  <template slot-scope="{ row, $index }">
+                    {{ row.weightUnit }}
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="单价"
+                  prop="univalence"
+                  width="100"
+                  align="center"
+                >
+                  <template slot-scope="{ row }">
+                    <template>
+                      {{ row.price ? row.price : '-' + '元' }}/{{
+                        row.weightUnit
+                      }}
+                      <!-- {{ { yuan: '元', wanyuan: '万元' }[row.univalenceUnit] }} -->
+                    </template>
+                  </template>
+                </el-table-column>
+
+                <el-table-column
+                  label="金额"
+                  align="center"
+                  prop="contentImage"
+                  :show-overflow-tooltip="true"
+                  width="100"
+                >
+                  <template slot-scope="{ row, $index }">
+                    <!-- // calcSum(
+                      //   row.outInNum,
+                      //   row.univalenceUnit,
+                      //   row.univalence,
+                      //   row
+                      // ) -->
+                    {{ row.totalMoney ? row.totalMoney : 0 }}
+                  </template>
+                </el-table-column>
+
+                <el-table-column
+                  label="货位"
+                  prop="warehouseName"
+                  :show-overflow-tooltip="true"
+                >
+                  <template slot-scope="{ row, $index }">
+                    {{ row.position }}
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </div>
+        <div class="mt20">
+          <!-- =={{ getDictValue('类型用途', infoData.assetType) }} -->
+          <!-- ${handleAssetType(extInfo.assetType)} -->
+          <header-title :title="`包装明细`" size="16px"></header-title>
+
+          <el-table
+            ref="multipleTable"
+            :data="detailList"
+            tooltip-effect="dark"
+            :header-cell-style="rowClass"
+            style="width: 100%"
+            stripe
+          >
+            <el-table-column label="序号" type="index" width="50">
+            </el-table-column>
+            <el-table-column label="编码" prop="categoryCode"></el-table-column>
+            <el-table-column label="名称" prop="name"></el-table-column>
+            <el-table-column label="批次号" prop="batchNo"></el-table-column>
+            <el-table-column label="包装编码" prop="code"></el-table-column>
+            <el-table-column
+              label="包装数量"
+              prop="packingCount"
+              width="80"
+            ></el-table-column>
+            <el-table-column
+              label="包装单位"
+              prop="packingUnit"
+            ></el-table-column>
+            <el-table-column
+              label="计量数量"
+              prop="minPackingCount"
+            ></el-table-column>
+            <el-table-column
+              label="计量单位"
+              prop="measuringUnit"
+            ></el-table-column>
+            <el-table-column
+              v-if="infoData.bizType == 2 || infoData.bizType == 1"
+              label="物料代号"
+              prop="materielCode"
+            >
+              <template slot-scope="{ row }">
+                {{ row.materielCode }}
+              </template>
+            </el-table-column>
+            <el-table-column
+              v-if="infoData.bizType == 2 || infoData.bizType == 1"
+              label="客户代号"
+              prop="clientCode"
+            >
+              <template slot-scope="{ row }">
+                {{ row.clientCode }}
+              </template>
+            </el-table-column>
+            <el-table-column label="重量" prop="weight">
+              <template slot-scope="{ row }">
+                {{ row.weight }}
+              </template>
+            </el-table-column>
+            <el-table-column label="重量单位" prop="weightUtil">
+              <template slot-scope="{ row }">
+                {{ row.weightUtil }}
+              </template>
+            </el-table-column>
+
+            <el-table-column
+              v-if="infoData.bizType == 1"
+              label="刻码"
+              prop="engrave"
+            >
+              <template slot-scope="{ row }">
+                {{ row.engrave }}
+              </template>
+            </el-table-column>
+
+            <el-table-column label="日期" prop="createTime" width="200">
+              <template slot="header" slot-scope="scope">
+                {{ dateTypes == 1 ? '采购日期' : '生产日期' }}
+              </template>
+              <template slot-scope="{ row }">
+                {{ row.createTime }}
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <div class="mt20">
+          <header-title :title="`物料明细`" size="16px"> </header-title>
+          <el-table
+            ref="multipleTable"
+            :data="metailList"
+            tooltip-effect="dark"
+            :header-cell-style="rowClass"
+            style="width: 100%"
+            stripe
+            height="300px"
+          >
+            <el-table-column label="序号" type="index" width="50">
+            </el-table-column>
+            <el-table-column label="编码" prop="assetCode"></el-table-column>
+            <el-table-column
+              label="名称"
+              prop="assetName"
+              width="200"
+            ></el-table-column>
+            <el-table-column
+              label="批次号"
+              prop="batchNo"
+              width="80"
+            ></el-table-column>
+            <el-table-column
+              label="物料编码"
+              prop="no"
+              width="200"
+            ></el-table-column>
+            <el-table-column
+              label="计量数量"
+              prop="minPackingCount"
+              width="90"
+            ></el-table-column>
+            <el-table-column
+              width="80"
+              label="计量单位"
+              prop="measuringUnit"
+            ></el-table-column>
+            <el-table-column
+              v-if="infoData.bizType == 2"
+              label="物料代号"
+              prop="materielCode"
+            >
+              <template slot-scope="{ row }">
+                {{ row.materielCode }}
+              </template>
+            </el-table-column>
+            <el-table-column
+              v-if="infoData.bizType == 2 || infoData.bizType == 1"
+              label="客户代号"
+              prop="clientCode"
+            >
+              <template slot-scope="{ row }">
+                {{ row.clientCode }}
+              </template>
+            </el-table-column>
+            <el-table-column
+              v-if="infoData.bizType == 1"
+              label="刻码"
+              prop="engrave"
+            >
+              <template slot-scope="{ row }">
+                {{ row.engrave }}
+              </template>
+            </el-table-column>
+            <el-table-column width="100" label="重量" prop="weight">
+              <template slot-scope="{ row }">
+                {{ row.weight }}
+              </template>
+            </el-table-column>
+            <el-table-column label="重量单位" prop="weightUnit">
+              <template slot-scope="{ row }">
+                {{ row.weightUnit }}
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+  // import { getInfo } from '@/api/stockManagement';
+  import StatusStep from '@/components/StatusStep/common.vue';
+  // import { fileSystemDownload } from '@/utils';
+  import outin from '@/api/warehouseManagement/outin';
+  import { getTreeByPid } from '@/api/classifyManage';
+
+  import {
+    materialType,
+    warehousingType,
+    useDict,
+    useDictLabel,
+    inputStatus,
+    emergencyState,
+    sceneState
+  } from '@/utils/dict/index';
+  import { auditStatus } from '@/utils/dict/common';
+  // import { batchBarPrint } from '@/api/ledgerAssets/booksList';
+  import { tableHeader } from './common';
+  import { mapGetters, mapActions } from 'vuex';
+  export default {
+    components: { StatusStep },
+    props: {
+      businessId: {
+        default: ''
+      }
+    },
+    data() {
+      return {
+        metailList: [],
+        dateTypes: 1,
+        detailList: [],
+        extInfo: {},
+        codeList: [],
+        auditStatus,
+        infoData: {},
+        warehousingMaterialList: [],
+        tableData2: [],
+        activeName: 'a',
+        num: 1,
+        openWindows: false, //打印弹窗
+        barCodeConfig: [],
+        stepsTitle: '已完成',
+        stepsStatus: 'success',
+        active: 0,
+
+        // 条码类型枚举
+        codeTypeObj: {
+          生产设备: 'EQUIPMENT',
+          舟皿: '',
+          周转车: 'TURNOVER_CAR',
+          模具: 'MODE',
+          库位: 'STORE_LOCAL',
+          混合料: 'MIX_MATER',
+          混炼料: 'MIXING_MATER',
+          破碎料: 'CRUSH_MATER',
+          货架: 'GOODS_SHELF',
+          返回料: 'RETURN_MATER',
+          返工料: 'REWORK_MATER',
+          备品备件: 'SPARE_PART',
+          车削料: 'LATHE_MATER',
+          风管料: 'WIND_PIPE_MATER',
+          地面料: 'GROUND_MATER'
+        }
+      };
+    },
+    watch: {
+      'infoData.verifyStatus': {
+        immediate: true,
+        handler(val) {
+          if (val == 0) {
+            this.active = 1;
+            this.stepsTitle = '未审核';
+            this.stepsStatus = 'wait';
+          } else if (val == 1) {
+            this.active = 2;
+            this.stepsTitle = '审核中';
+            this.stepsStatus = 'process';
+          } else if (val == 2) {
+            this.active = 2;
+            this.stepsTitle = '审核通过';
+            this.stepsStatus = 'success';
+          } else if (val == 3) {
+            this.active = 2;
+            this.stepsTitle = '驳回';
+            this.stepsStatus = 'error';
+          }
+        }
+      }
+    },
+    computed: {
+      ...mapGetters(['getDictValue']),
+      curDateType() {
+        if (this.materialCodeReqList) {
+          return this.materialCodeReqList[0].manufactureTime
+            ? 'manufactureTime'
+            : 'procurementTime';
+        }
+      },
+      tableHeader() {
+        return tableHeader(this.infoData.assetType);
+      },
+      emergencyState() {
+        return useDict(emergencyState)(this.infoData.emergencyState);
+      }
+      // 条码信息
+      // materialCodeReqList() {
+      //   return this.warehousingMaterialList.warehouseLedgerDetails;
+      // }
+    },
+    created() {
+      this.requestDict('类型用途');
+      this._getInfo();
+    },
+    methods: {
+      ...mapActions('dict', ['requestDict']),
+      getAuditStatus: useDictLabel(auditStatus),
+      getMaterialType: useDictLabel(materialType),
+      getInputStatus: useDictLabel(inputStatus),
+      getSceneState: useDictLabel(sceneState),
+      handleRowUnit(row) {
+        if (this.extInfo.assetType == 1) {
+          console.log(row);
+          return row.weightUnit;
+        } else if (this.extInfo.assetType == 4) {
+          return row.measuringUnit;
+        } else {
+          return row.measuringUnit;
+        }
+      },
+      handleAssetType(r) {
+        const code = this.codeList.find((item) => item.dictCode == r);
+        return code?.dictValue;
+      },
+      rowClass({ row, column, rowIndex, columnIndex }) {
+        if (rowIndex === 1) {
+          return {
+            display: 'none',
+            background: '#EEEEEE',
+            border: 'none'
+          };
+        }
+
+        return { background: '#EEEEEE', border: 'none' };
+      },
+      async _getInfo() {
+        const res = await outin.getById(this.businessId);
+        console.log('===', res);
+        if (res) {
+          this.infoData = res;
+          this.extInfo = res.extInfo;
+          this.warehousingMaterialList = res.outInDetailVOList;
+          const arr = [];
+          for (const key in this.warehousingMaterialList) {
+            for (const k in this.warehousingMaterialList[key]
+              .outInDetailRecordVOList) {
+              arr.push({
+                ...this.warehousingMaterialList[key].outInDetailRecordVOList[k],
+                weightUnit: this.warehousingMaterialList[key].weightUnit
+              });
+            }
+          }
+          this.dateTypes = arr[0].dateType;
+          this.detailList = arr;
+          let iArr = [];
+          arr.forEach((item) => {
+            item.outInDetailRecordMaterialDetailVOList.forEach((ele) => {
+              iArr.push({ ...ele });
+            });
+          });
+          this.metailList = iArr;
+        }
+        const { data } = await getTreeByPid(0);
+        this.codeList = data.map((item) => {
+          return { dictCode: item.id, dictValue: item.name };
+        });
+      },
+      calcSum(a, b, c, row) {
+        if (
+          (Number.isNaN(+a) && a !== '') ||
+          (Number.isNaN(+b) && b !== '') ||
+          (Number.isNaN(+c) && c !== '')
+        ) {
+          return '';
+        }
+
+        return a * b * c + { yuan: '元', wanyuan: '万元' }[row.univalenceUnit];
+      },
+      contentImageDownload(item) {
+        fileSystemDownload(item);
+      },
+      selectActive(num) {
+        this.num = num;
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  ::v-deep .page-title {
+    border-bottom: none;
+  }
+  ::v-deep .page-title-div {
+    width: 100%;
+  }
+  .stepsStatus {
+    width: 40%;
+    margin: 0 auto;
+  }
+  .el-form-item {
+    margin-bottom: 10px;
+  }
+  .p20 {
+    padding: 20px;
+  }
+  .flex {
+    display: flex;
+  }
+  .title {
+    justify-content: space-between;
+    border-bottom: 1px solid #ccc;
+    padding-bottom: 5px;
+    span {
+      font-size: 16px;
+    }
+    .col {
+      padding-left: 40px;
+      font-size: 14px;
+      color: #aaaaaa;
+    }
+  }
+  .degree {
+    margin-right: 10px;
+    padding: 0px 15px;
+    color: #fff;
+    font-size: 13px;
+    line-height: 23px;
+    border-radius: 23px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    span {
+      width: 5px;
+      height: 5px;
+      border-radius: 100%;
+      margin-right: 6px;
+      background-color: #fff;
+    }
+  }
+  .red {
+    background-color: rgb(163, 0, 20);
+  }
+  .blue {
+    background-color: #1989fa;
+  }
+  .createdInfo {
+    justify-content: space-around;
+    margin-top: 10px;
+    font-size: 14px;
+    .col {
+      color: #6e6e6e;
+      padding-right: 10px;
+    }
+  }
+  .mt40 {
+    margin-top: 40px;
+  }
+
+  .custSteps {
+    margin-top: 20px;
+    margin-left: 70px;
+    .box {
+      width: 158px;
+      border: 1px solid #ccc;
+      padding: 10px;
+      flex-direction: row;
+      flex-wrap: wrap;
+      // justify-content: space-between;
+      font-size: 12px;
+      color: #9e9e9e;
+      .x {
+        width: 20px;
+        height: 15px;
+        margin-right: 5px;
+      }
+      .q {
+        background-color: #d0e4d5;
+      }
+      .b {
+        background-color: #1989fa;
+      }
+      .g {
+        background-color: #157a2c;
+      }
+      .r {
+        background-color: #a30014;
+      }
+      .a {
+        align-items: center;
+        margin-bottom: 10px;
+      }
+      .mr10 {
+        margin-right: 10px;
+      }
+      .mb0 {
+        margin-bottom: 0;
+      }
+    }
+    .stepsInfo {
+      // flex: 1;
+      width: 483px;
+    }
+  }
+  .mt20 {
+    margin-top: 20px;
+  }
+  .content-detail {
+    overflow: hidden;
+  }
+  .executor {
+    font-size: 14px;
+    .col {
+      color: #6e6e6e;
+      padding-right: 10px;
+    }
+  }
+  .result {
+    justify-content: space-around;
+  }
+  .mr20 {
+    margin-right: 20px;
+  }
+  .details {
+    font-size: 14px;
+    margin-bottom: 10px;
+  }
+
+  .customSteps {
+    margin-top: 40px;
+    font-size: 14px;
+    margin-left: 80px;
+    .time {
+      font-size: 12px;
+      color: #6e6e6e;
+      margin-right: 20px;
+      position: relative;
+      &::after {
+        content: '';
+        width: 1px;
+        height: 100%;
+        background-color: #157a2c;
+        position: absolute;
+        right: -26px;
+      }
+    }
+    .flex:last-child {
+      .time {
+        &::after {
+          display: none;
+        }
+      }
+    }
+    .round {
+      margin-right: 20px;
+      width: 10px;
+      height: 10px;
+      border-radius: 100%;
+      background-color: #157a2c;
+      position: relative;
+      span {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        width: 4px;
+        height: 4px;
+        background-color: #fff;
+        border-radius: 100%;
+        transform: translate(-2px, -2px);
+      }
+    }
+    .text {
+      .info {
+        margin-top: 10px;
+        width: 955px;
+        background-color: #f0f3f3;
+        overflow: hidden;
+        padding: 10px;
+        margin-bottom: 10px;
+      }
+    }
+  }
+  .switch_left li {
+    border-right: 1px solid rgba(222, 222, 222, 1);
+    border-left: 1px solid rgba(222, 222, 222, 1);
+  }
+</style>

+ 108 - 0
src/views/bpm/handleTask/components/inoutBound/submit.vue

@@ -0,0 +1,108 @@
+<template>
+  <el-col :span="16" :offset="6">
+    <el-form label-width="100px" ref="formRef" :model="form">
+      <el-form-item
+        label="审批建议"
+        prop="reason"
+        style="margin-bottom: 20px"
+        :rules="{
+          required: true,
+          message: '请选择',
+          trigger: 'change'
+        }"
+      >
+        <el-input
+          type="textarea"
+          v-model="form.reason"
+          placeholder="请输入审批建议"
+        />
+      </el-form-item>
+    </el-form>
+
+    <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
+      <el-button
+        icon="el-icon-edit-outline"
+        type="success"
+        size="mini"
+        @click="handleAudit(1)"
+        >通过
+      </el-button>
+
+      <el-button
+        icon="el-icon-circle-close"
+        type="danger"
+        size="mini"
+        @click="handleAudit(0)"
+        >驳回
+      </el-button>
+    </div>
+  </el-col>
+</template>
+<script>
+  import {
+    approveTaskWithVariables,
+    outinApproveNotPass
+  } from '@/api/bpm/task';
+  export default {
+    data() {
+      return {
+        form: {}
+      };
+    },
+    props: {
+      businessId: {
+        default: ''
+      },
+      taskId: {
+        default: ''
+      },
+      id: {
+        default: ''
+      },
+
+      taskDefinitionKey: {
+        default: ''
+      }
+    },
+    methods: {
+      handleAudit(status) {
+        if (!this.form.reason && status == 1) {
+          this.$message.warning(`请填写审批意见!`);
+          return;
+        }
+
+        this._approveTaskWithVariables(status);
+      },
+      async _approveTaskWithVariables(status) {
+        console.log(status);
+        if (status == 1) {
+          const params = {
+            id: this.taskId,
+            reason: this.form.reason,
+            variables: { pass: true }
+          };
+          const data = await approveTaskWithVariables(params);
+          if (data.data.code != '-1') {
+            this.$emit('handleAudit', {
+              status,
+              title: '通过'
+            });
+          }
+        } else {
+          const params = {
+            id: this.taskId,
+            reason: this.form.reason,
+            outInId: this.businessId
+          };
+          const data = await outinApproveNotPass(params);
+          if (data.data.code != '-1') {
+            this.$emit('handleAudit', {
+              status,
+              title: '驳回'
+            });
+          }
+        }
+      }
+    }
+  };
+</script>

+ 4 - 8
src/views/bpm/handleTask/index.vue

@@ -47,7 +47,7 @@
             @getTableValue="getTableValue"
             @handleAudit="handleAudit"
             @handleUpdateAssignee="handleUpdateAssignee(item)"
-            @handleBackList=handleBackList(item)
+            @handleBackList="handleBackList(item)"
           ></async-sub-form-component>
         </div>
         <!-- <el-col :span="16" :offset="6">
@@ -375,7 +375,6 @@
           }
           // 设置流程信息
           this.processInstance = response;
-
           // //将业务表单,注册为动态组件
           // let formCustomCreatePath = JSON.parse(
           //   this.processInstance.processDefinition.formCustomCreatePath
@@ -388,7 +387,6 @@
           Vue.component('async-sub-form-component', (resolve) => {
             require([`@/views${this.listData.pcHandleRouter}`], resolve);
           });
-
           //   // 设置表单信息
           //   if (this.processInstance.processDefinition.formType === 10) {
           //     this.detailForm = {
@@ -459,8 +457,8 @@
 
       /** 处理审批通过和不通过的操作 */
       handleAudit(data) {
-        let text=data.status === 1 ? '通过' : '不通过'
-        this.$message.success(`审批${data.title||text}成功!`);
+        let text = data.status === 1 ? '通过' : '不通过';
+        this.$message.success(`审批${data.title || text}成功!`);
         this.handleClose(); // 获得最新详情
         // const index = this.runningTasks.indexOf(task);
         // this.$refs['form' + index][0].validate((valid) => {
@@ -593,9 +591,7 @@
       },
       getTableValue(fn) {
         fn(this.$refs.bziRef.getTableValue());
-      },
-     
-      
+      }
     }
   };
 </script>

+ 0 - 1
src/views/bpm/todo/index.vue

@@ -215,7 +215,6 @@
       /** 处理审批按钮 */
 
       handleAudit(type, row) {
-
         if (type == 'audit') {
           this.$refs.handleTaskRef.open({
             id: row.processInstance.id,