cuikaidong
2025-05-23 752030a34315629a07810faff9bcd6522c1ebf41
Merge remote-tracking branch 'origin/master'

# Conflicts:
# src/views/flowable/workflow/FlowTodo.vue
已添加2个文件
已修改10个文件
1062 ■■■■■ 文件已修改
src/views/eam/maintenance/EamThirdMaintenanceOrderList.vue 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/maintenance/modules/EamThirdMaintenanceOrderModal.vue 153 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/spare/EamSparePartsList.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/spare/modules/EamSpareParts/EamSparePartIntoModal.vue 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/spare/modules/EamSpareParts/EamSparePartInventoryList.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/spare/modules/EamSpareParts/EamSparePartsModal.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/workflow/FlowCompleted.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/workflow/FlowTodo.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue 493 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/OutboundDetailList.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/OutboundOrderList.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/modules/outBound/OutboundOrderModal.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/maintenance/EamThirdMaintenanceOrderList.vue
@@ -78,25 +78,26 @@
        :pagination="ipagination"
        :loading="loading"
        class="j-table-force-nowrap"
        :scroll="{x:'max-content'}"
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
        @change="handleTableChange">
        <span slot="action" slot-scope="text, record">
          <template v-if="record.maintenanceStatus === 'WAIT_MAINTENANCE' && isShowAuth('eam:secondMaintenance:edit')">
          <a @click="handleEdit(record)">编辑</a>
          <template v-if="record.maintenanceStatus === 'WAIT_MAINTENANCE'">
          <a @click="handleEdit(record)" v-if="isShowAuth('eam:thirdMaintenance:edit')">编辑</a>
          <a-divider type="vertical" />
          <a-divider type="vertical" v-if="isShowAuth('eam:thirdMaintenance:edit')" />
          <a-popconfirm title="确定领取吗?" @confirm="() => handlerCollect(record.id)">
          <a-popconfirm title="确定领取吗?" @confirm="() => handlerCollect(record.id)" v-if="isShowAuth('eam:thirdMaintenance:collect')">
            <a>领取</a>
          </a-popconfirm>
          <a-divider type="vertical" />
          <a-divider type="vertical" v-if="isShowAuth('eam:thirdMaintenance:collect')" />
          <a-dropdown>
            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
            <a-menu slot="overlay">
              <a-menu-item>
              <a-menu-item v-if="isShowAuth('eam:thirdMaintenance:abolish')">
                <a-popconfirm title="确定作废吗?" @confirm="() => handlerAbolish(record.id)">
                  <a>作废</a>
                </a-popconfirm>
@@ -205,6 +206,16 @@
          dataIndex: 'operator_dictText'
        },
        {
          title: '精度检验人',
          align: 'center',
          dataIndex: 'precisionChecker_dictText'
        },
        {
          title: '精度检验时间',
          align: 'center',
          dataIndex: 'precisionCheckTime'
        },
        {
          title: '保养状态',
          align: 'center',
          dataIndex: 'maintenanceStatus_dictText'
@@ -215,6 +226,42 @@
          dataIndex: 'creationMethod_dictText'
        },
        {
          title: '机动办确认',
          align: 'center',
          dataIndex: 'confirmUser_dictText',
          width: 60
        },
        {
          title: '机动办确认时间',
          align: 'center',
          dataIndex: 'confirmTime',
          width: 60
        },
        {
          title: '机动办意见',
          align: 'center',
          dataIndex: 'confirmComment',
          width: 60
        },
        {
          title: '确认领导',
          align: 'center',
          dataIndex: 'confirmLeader_dictText',
          width: 60
        },
        {
          title: '领导确认时间',
          align: 'center',
          dataIndex: 'leaderConfirmTime',
          width: 60
        },
        {
          title: '领导意见',
          align: 'center',
          dataIndex: 'leaderConfirmComment',
          width: 60
        },
        {
          title: '备注',
          align: 'center',
          dataIndex: 'remark'
src/views/eam/maintenance/modules/EamThirdMaintenanceOrderModal.vue
@@ -57,21 +57,38 @@
          </a-form-model-item>
        </a-row>
        <a-row :gutter="24">
          <a-spin :spinning="detail.loading">
            <j-vxe-table
              ref="editableDetailTable"
              :rowNumber="true"
              :rowSelection="true"
              :bordered="true"
              :alwaysEdit="true"
              :toolbar="true"
              :toolbarConfig="detail.toolbarConfig"
              keep-source
              :height="300"
              :dataSource="detail.dataSource"
              :columns="detail.columns"
              style="margin-top: 8px;" />
          </a-spin>
          <a-tabs v-model="activeTabKey">
            <a-tab-pane key="1" tab="保养项" :forceRender="true">
              <j-vxe-table
                ref="editableDetailTable"
                :rowNumber="true"
                :rowSelection="true"
                :bordered="true"
                :alwaysEdit="true"
                :toolbar="true"
                :toolbarConfig="detail.toolbarConfig"
                keep-source
                :height="300"
                :dataSource="detail.dataSource"
                :columns="detail.columns"
                style="margin-top: 8px;" />
            </a-tab-pane>
            <a-tab-pane key="2" tab="精度参数" :forceRender="true">
              <j-vxe-table
                ref="editablePrecisionDetailTable"
                :rowNumber="true"
                :rowSelection="true"
                :bordered="true"
                :alwaysEdit="true"
                :toolbar="false"
                :toolbarConfig="precisionDetail.toolbarConfig"
                keep-source
                :height="300"
                :dataSource="precisionDetail.dataSource"
                :columns="precisionDetail.columns"
                style="margin-top: 8px;" />
            </a-tab-pane>
          </a-tabs>
        </a-row>
      </a-form-model>
    </a-spin>
@@ -111,6 +128,8 @@
      },
      confirmLoading: false,
      spinning: false,
      activeTabKey: '1',
      maintenanceOperatorOptions: [],
      validatorRules: {
        equipmentId: [
          { required: true, message: '请选择设备!' }
@@ -124,7 +143,9 @@
        edit: '/eam/thirdMaintenanceOrder/edit',
        standardDetail: '/eam/eamMaintenanceStandardDetail/queryList',
        detail: '/eam/thirdMaintenanceOrderDetail/queryList',
        userSelect: '/eam/user_select/list'
        userSelect: '/eam/user_select/list',
        precisionDetail: '/eam/equipmentPrecisionParameters/queryList',
        precisionCheckDetail: '/eam/precisionCheckDetail/queryList',
      },
      detail: {
        loading: false,
@@ -184,6 +205,59 @@
          // add æ–°å¢žæŒ‰é’®ï¼›remove åˆ é™¤æŒ‰é’®ï¼›clearSelection æ¸…空选择按钮
          btn: ['add', 'remove', 'clearSelection']
        }
      },
      precisionDetail: {
        loading: false,
        dataSource: [],
        columns: [
          {
            title: 'ID',
            key: 'id',
            type: JVXETypes.hidden
          },
          {
            title: 'orderId',
            key: 'orderId',
            type: JVXETypes.hidden
          },
          {
            title: 'equipmentId',
            key: 'equipmentId',
            type: JVXETypes.hidden
          },
          {
            title: 'parameterId',
            key: 'parameterId',
            type: JVXETypes.hidden
          },
          {
            title: '检测项目',
            key: 'parameterId_dictText',
            type: JVXETypes.normal,
            width: '25%',
            align: 'center'
          },
          {
            title: '参数编码',
            key: 'parameterCode_dictText',
            type: JVXETypes.normal,
            width: '20%',
            align: 'center',
          },
          {
            title: '允差值',
            key: 'parameterValue',
            type: JVXETypes.normal,
            width: '30%',
            align: 'center',
          }
        ],
        toolbarConfig: {
          // prefix å‰ç¼€ï¼›suffix åŽç¼€
          slot: ['prefix', 'suffix'],
          // add æ–°å¢žæŒ‰é’®ï¼›remove åˆ é™¤æŒ‰é’®ï¼›clearSelection æ¸…空选择按钮
          btn: ['add', 'remove', 'clearSelection']
        }
      }
    }
  },
@@ -191,6 +265,7 @@
  },
  methods: {
    add() {
      this.initParams();
      //初始化默认值
      this.model = {}
      this.visible = true
@@ -198,11 +273,13 @@
      this.detail.dataSource = []
    },
    edit(record) {
      this.initParams();
      this.model = Object.assign({}, record)
      this.visible = true
      this.editable = true
      this.detail.dataSource = []
      this.loadDetail(record.id)
      this.loadPrecisionDetail(record.id)
    },
    close() {
      this.$emit('close')
@@ -223,6 +300,11 @@
          let removeData = that.$refs.editableDetailTable.getDeleteData()
          that.model.tableDetailList = [...tableData]
          that.model.removeDetailList = [...removeData]
          let precisionDetailList = that.$refs.editablePrecisionDetailTable.getTableData()
          let removePrecisionDetailList = that.$refs.editablePrecisionDetailTable.getDeleteData()
          that.model.precisionDetailList = [...precisionDetailList]
          that.model.removePrecisionDetailList = [...removePrecisionDetailList]
          that.confirmLoading = true
          let httpurl = ''
@@ -272,6 +354,7 @@
      if (!this.model.equipmentId) delete this.model.operator
      if (!this.model.id) {
        this.loadStandardDetail(selectObj.id)
        this.loadPrecisionParameterList(selectObj.equipmentId)
      }
      this.loadMaintenanceOperatorList(this.model.equipmentId)
    },
@@ -331,8 +414,42 @@
        .catch(err => {
          if (that.model.operator) delete that.model.operator
        })
    }
    },
    loadPrecisionParameterList(equipmentId) {
      this.precisionDetail.dataSource = []
      if (equipmentId) {
        this.spinning = true
        getAction(this.url.precisionDetail, { equipmentId: equipmentId })
          .then(res => {
            if (res.success) {
              this.precisionDetail.dataSource = res.result.map(item => ({
                equipmentId: item.equipmentId,
                parameterId: item.parameterId,
                parameterId_dictText: item.parameterId_dictText,
                parameterCode_dictText: item.parameterCode_dictText,
                parameterValue: item.parameterValue,
              }))
            }
          })
          .finally(() => {
            this.spinning = false
          })
      }
    },
    loadPrecisionDetail(orderId) {
      if (orderId) {
        getAction(this.url.precisionCheckDetail, { orderId: orderId }).then(res => {
          if (res.success) {
            this.precisionDetail.dataSource = [...res.result]
          }
        })
      }
    },
    initParams() {
      this.detail.dataSource = []
      this.precisionDetail.dataSource = []
      this.activeTabKey = '1'
    },
  }
}
</script>
src/views/eam/spare/EamSparePartsList.vue
@@ -98,6 +98,12 @@
        type="primary"
        icon="plus"
      >新增</a-button>
      <a-button
        @click="handleInto"
        type="primary"
        icon="plus"
      >入库</a-button>
      <!-- <a-button
        type="primary"
        icon="download"
@@ -198,6 +204,11 @@
      ref="modalForm"
      @ok="modalFormOk"
    ></eamSpareParts-modal>
    <eamSpare-part-into-modal
      ref="intoModalForm"
      @ok="modalFormOk"
    ></eamSpare-part-into-modal>
  </a-card>
</template>
@@ -205,6 +216,7 @@
import '@assets/less/TableExpand.less'
import EamSparePartsModal from './modules/EamSpareParts/EamSparePartsModal.vue'
import EamSparePartInventoryList from './modules/EamSpareParts/EamSparePartInventoryList.vue'
import EamSparePartIntoModal from './modules/EamSpareParts/EamSparePartIntoModal.vue'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
export default {
@@ -212,7 +224,8 @@
  mixins: [JeecgListMixin],
  components: {
    EamSparePartsModal,
    EamSparePartInventoryList
    EamSparePartInventoryList,
    EamSparePartIntoModal
  },
  data() {
    return {
@@ -281,6 +294,11 @@
          dataIndex: 'inventoryWarning'
        },
        {
          title: '库存总数',
          align: "center",
          dataIndex: 'totalQuantity'
        },
        {
          title: '操作',
          dataIndex: 'action',
          align: "center",
@@ -302,11 +320,20 @@
    }
  },
  methods: {
    handleInto() {
      this.$refs.intoModalForm.add();
      this.$refs.intoModalForm.title = "入库";
    },
    searchReset() {
      this.queryParam = {}
      this.onClearSelected()
      this.loadData(1);
    },
    searchQuery() {
      this.onClearSelected()
      this.loadData(1);
    },
    clickThenSelect(record) {
      return {
        on: {
src/views/eam/spare/modules/EamSpareParts/EamSparePartIntoModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,233 @@
<template>
  <j-modal
    :title="title"
    :width="1500"
    :visible="visible"
    :confirmLoading="confirmLoading"
    switchFullscreen
    centered
    :mask-closable="false"
    @ok="handleOk"
    @cancel="handleCancel"
    cancelText="关闭"
  >
    <a-spin :spinning="spinning">
      <a-form-model
        ref="form"
        :model="model"
        :rules="validatorRules"
        :labelCol="labelCol"
        :wrapperCol="wrapperCol"
      >
        <a-row :gutter="24">
          <j-vxe-table
            ref="editableDetailTable"
            :rowNumber="true"
            :rowSelection="true"
            :bordered="true"
            :alwaysEdit="true"
            :toolbar="true"
            keep-source
            :height="300"
            :loading="detail.loading"
            :dataSource="detail.dataSource"
            :columns="detail.columns"
            style="margin-top: 8px;"
          />
        </a-row>
      </a-form-model>
    </a-spin>
  </j-modal>
</template>
<script>
import { getAction, httpAction } from '@/api/manage'
import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'
import { JVXETypes } from '@/components/jeecg/JVxeTable'
export default {
  name: 'EamSparePartIntoModal',
  mixins: [JVxeTableModelMixin],
  components: {},
  data() {
    return {
      title: '操作',
      visible: false,
      model: {},
      labelCol: {
        xs: { span: 24 },
        sm: { span: 6 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 15 }
      },
      confirmLoading: false,
      spinning: false,
      disabled: false,
      validatorRules: {},
      url: {
        add: '/eam/eamSparePartInventory/add',
        edit: '/eam/eamSparePartInventory/edit',
      },
      detail: {
        loading: false,
        dataSource: [],
        columns: [
          {
            title: '来源类型',
            key: 'sparePartIntoType',
            type: JVXETypes.hidden,
            width: '12%',
            align: 'center',
            defaultValue: '1',
            validateRules: [
              { required: true, message: '备件不能为空!' }
            ]
          },
          {
            title: '备件',
            key: 'sparePartId',
            type: JVXETypes.select,
            width: '12%',
            align: 'center',
            dictCode: 'eam_spare_parts,part_name,id, del_flag!=\'1\'',
            validateRules: [
              { required: true, message: '备件不能为空!' }
            ]
          },
          {
            title: '批次号',
            key: 'batchNum',
            type: JVXETypes.input,
            width: '10%',
            align: 'center',
            validateRules: [
              { required: true, message: '批次号不能为空!' }
            ]
          },
          {
            title: '数量',
            key: 'inventory',
            type: JVXETypes.inputNumber,
            width: '10%',
            align: 'center',
            validateRules: [
              { required: true, message: '数量不能为空!' }
            ]
          },
          {
            title: '出厂日期(生产日期)',
            key: 'manufactureDate',
            type: JVXETypes.datetime,
            width: '16%',
            align: 'center',
            validateRules: [
              { required: false, message: '出厂日期(生产日期)不能为空!' }
            ]
          },
          {
            title: '供应商',
            key: 'supplier',
            type: JVXETypes.textarea,
            width: '15%',
            align: 'center',
            validateRules: [
              { required: false, message: '供应商不能为空!' }
            ]
          },
          {
            title: '截止有效期',
            key: 'expirationOfValidity',
            type: JVXETypes.datetime,
            width: '16%',
            align: 'center',
            validateRules: [
              { required: false, message: '截止有效期不能为空!' }
            ]
          },
          {
            title: '存放位置',
            key: 'location',
            type: JVXETypes.textarea,
            width: '13%',
            align: 'center',
            validateRules: [
              { required: false, message: '存放位置不能为空!' }
            ]
          },
        ]
      }
    }
  },
  created() {
  },
  methods: {
    add() {
      this.model = {}
      this.detail.dataSource = []
      this.visible = true
    },
    async handleOk() {
      const that = this
      let errMap = await that.$refs.editableDetailTable.validateTable()
      if (errMap) {
        this.$message.warning('数据校验失败!')
        return
      }
      // è§¦å‘表单验证
      this.$refs.form.validate(valid => {
        if (valid) {
          let tableData = that.$refs.editableDetailTable.getTableData()
          let removeData = that.$refs.editableDetailTable.getDeleteData()
          that.model.eamSparePartInventories = [...tableData]
          that.model.removeDetailList = [...removeData]
          that.confirmLoading = that.spinning = true
          let httpurl = ''
          let method = ''
          if (!this.model.id) {
            httpurl += this.url.add
            method = 'post'
          } else {
            httpurl += this.url.edit
            method = 'put'
          }
          httpAction(httpurl, this.model, method).then((res) => {
            if (res.success) {
              that.$message.success(res.message)
              that.$emit('ok')
              that.close()
            } else {
              that.$message.warning(res.message)
            }
          }).finally(() => {
            that.confirmLoading = that.spinning = false
          })
        } else {
          return false
        }
      })
    },
    handleCancel() {
      this.close()
    },
    close() {
      this.$emit('close')
      this.visible = false
      this.$refs.form.clearValidate()
    }
  }
}
</script>
<style lang="less" scoped>
</style>
src/views/eam/spare/modules/EamSpareParts/EamSparePartInventoryList.vue
@@ -81,11 +81,11 @@
            return parseInt(index) + 1;
          }
        },
        // {
        //   title: '备品备件ID',
        //   align: "center",
        //   dataIndex: 'sparePartId'
        // },
        {
          title: '来源类型',
          align: "center",
          dataIndex: 'sparePartIntoType_dictText'
        },
        {
          title: '批次号',
          align: "center",
@@ -116,12 +116,12 @@
          align: "center",
          dataIndex: 'location'
        },
        {
          title: '操作',
          dataIndex: 'action',
          align: "center",
          scopedSlots: { customRender: 'action' },
        }
        // {
        //   title: '操作',
        //   dataIndex: 'action',
        //   align: "center",
        //   scopedSlots: { customRender: 'action' },
        // }
      ],
      url: {
        list: "/eam/eamSparePartInventory/list",
src/views/eam/spare/modules/EamSpareParts/EamSparePartsModal.vue
@@ -1,7 +1,7 @@
<template>
  <j-modal
    :title="title"
    :width="800"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    switchFullscreen
src/views/flowable/workflow/FlowCompleted.vue
@@ -67,6 +67,8 @@
    <week-maintenance-approval-modal ref="weekMaintenanceApprovalModal" :selectShenpiData="selectWeekMaintenanceData"/>
    <repair-order-approval-modal ref="repairOrderApprovalModal" :selectShenpiData="selectRepairOrderData"/>
    <out-bound-order-handle ref="outBoundOrderHandle" :selectShenpiData="selectOutBoundOrderData"/>
  </a-card>
</template>
@@ -81,6 +83,7 @@
  import InspectionOrderHandle from './InspectionOrder/InspectionOrderHandle'
  import WeekMaintenanceApprovalModal from './weekMaintenance/WeekMaintenanceApprovalModal'
  import RepairOrderApprovalModal from './repairOrder/RepairOrderApprovalModal'
  import OutBoundOrderHandle from '@views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue'
  export default {
    name: 'NcDeviceCharactersList',
@@ -91,7 +94,8 @@
      RepairOrderApprovalModal,
      WeekMaintenanceApprovalModal,
      InspectionOrderHandle,
      JDictSelectTag
      JDictSelectTag,
      OutBoundOrderHandle
    },
    data() {
      return {
@@ -161,7 +165,8 @@
        selectDispatchFileXqData:{},
        selectWeekMaintenanceData: {},
        selectInspectionOrderXqData: {},
        selectRepairOrderData: {}
        selectRepairOrderData: {},
        selectOutBoundOrderData: {}
      }
    },
    created() {
@@ -193,6 +198,9 @@
            break
          case 'eam_repair':
            this.handleRepairOrder(item)
            break
          case 'toolOutStorageApproval':
            this.handleToolOutStorageApproval(item)
            break
          default:
            alert('没找到该流程')
@@ -264,6 +272,16 @@
          processInstanceId: procInsId
        })
        this.$refs.repairOrderApprovalModal.getBasicInformation(record)
      },
      handleToolOutStorageApproval(item) {
        this.selectOutBoundOrderData = Object.assign({}, item)
        item.procInstId = item.procInsId
        item.processInstanceId = item.procInsId
        this.selectOutBoundOrderData.assignee_dictText = item.todoUsers_dictText
        this.$refs.outBoundOrderHandle.auditVisible = false
        this.$refs.outBoundOrderHandle.clearTableSource()
        this.$refs.outBoundOrderHandle.getAllApproveData(item)
      }
    }
  }
src/views/flowable/workflow/FlowTodo.vue
@@ -111,6 +111,8 @@
                                     @searchReset="searchReset"></week-maintenance-approval-modal>
    <repair-order-approval-modal ref="repairOrderApprovalModal" @searchReset="searchReset"
                                 :selectShenpiData="selectRepairOrderData"></repair-order-approval-modal>
    <out-bound-order-handle ref="outBoundOrderHandle" :selectShenpiData="selectOutBoundOrderData"
                              @searchReset="searchReset"></out-bound-order-handle>
    <!--批量处理-->
    <inspection-order-batch-handle ref="inspectionOrderBatchHandleRef" @searchReset="searchReset"
@@ -144,7 +146,7 @@
  import AssignFileStreamHandle from '@views/flowable/workflow/assignFileStream/AssignFileStreamHandle.vue'
  import DispatchFileHandle from '@views/flowable/workflow/dispatchFile/DispatchFileHandle.vue'
  import DispatchFileBachHandleStyle from '@views/flowable/workflow/dispatchFile/DispatchFileBachHandleStyle#Drawer.vue'
  import OutBoundOrderHandle from '@views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue'
  import EquipmentLeanOutApprovalModal from '@views/flowable/workflow/leanOut/EquipmentLeanOutApprovalModal.vue'
  import SecondMaintenanceApprovalModal from '@views/flowable/workflow/secondMaintenance/SecondMaintenanceApprovalModal.vue'
  import ThirdMaintenanceApprovalModal from '@views/flowable/workflow/thirdMaintenance/ThirdMaintenanceApprovalModal.vue'
@@ -165,6 +167,7 @@
      EquipmentLeanOutApprovalModal,
      SecondMaintenanceApprovalModal,
      ThirdMaintenanceApprovalModal,
      OutBoundOrderHandle,
      EquipmentSealUpApprovalModal,
    },
    data() {
@@ -247,6 +250,7 @@
        selectThirdMaintenanceData: {},
        selectBachData: {},
        selectRepairOrderData: {},
        selectOutBoundOrderData: {},
        //业务信息ID
        dataId: undefined
      }
@@ -326,6 +330,9 @@
            break
          case 'third_maintenance':
            this.handleThirdMaintenance(item)
            break
          case 'toolOutStorageApproval':
            this.handleToolOutStorageApproval(item)
            break
          case 'equipment_seal_up':
            this.handleEquipmentSealUp(item)
@@ -436,6 +443,14 @@
          this.$refs.thirdMaintenanceApprovalModal.disableSubmit = false
        }
      },
      handleToolOutStorageApproval(item) {
        if (item && item.dataId) {
          this.selectOutBoundOrderData = Object.assign({}, item)
          this.$refs.outBoundOrderHandle.auditVisible = true
          this.$refs.outBoundOrderHandle.clearTableSource()
          this.$refs.outBoundOrderHandle.getAllApproveData(item)
        }
      }
      handleEquipmentSealUp(item) {
        this.$refs.equipmentSealUpApprovalModelRef.visible = true
        this.$refs.equipmentSealUpApprovalModelRef.title = item.name
src/views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,493 @@
<!--
 Description: å·¥ä½œæµ-出库申请单审批处理页面 List
 Author: ä½œè€… liuyh
 Date:   2025-02-27
-->
<template>
  <a-modal
    :title="title"
    :width="width"
    :visible="visible"
    :footer="null"
    @cancel="handCancel"
  >
    <a-card :bordered="false">
      <div>
        <b>{{ selectShenpiData.description }}</b>
        <br>
        <br>
        <a-tag color="blue">
          å¤„理人 {{ selectShenpiData.assignee_dictText }}
        </a-tag>
        <a-tag color="blue">
          åˆ›å»ºæ—¶é—´ {{ selectShenpiData.createTime }}
        </a-tag>
        <br>
        <br>
        <button @click="fetchAndShowBmp" class="btn-custom">打开流程图</button>
        <div v-if="imageSrc">
          <img :src="imageSrc" alt="Fetched Image" />
        </div>
        <hr class="shallow-hr">
      </div>
      <div>
        <b>申请详情</b>
        <br>
        <a-form :form='form'>
          <a-spin :spinning="spinning">
            <a-tabs default-active-key='1' @change='callback'>
              <a-tab-pane key='1' tab='申请基本信息'>
                <a-form-model ref='form' :model='tableRowRecord'>
                  <a-row>
                    <a-col :span='span'>
                      <a-form-model-item label='出库单编号' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='outNum'>
                        <a-input :disabled='coldisabled' v-model='tableRowRecord.outNum'></a-input>
                      </a-form-model-item>
                    </a-col>
                    <a-col :span='span'>
                      <a-form-model-item label='出库类型' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='outStorehouseType'>
                        <j-dict-select-tag :disabled="coldisabled" type="list" v-model="tableRowRecord.outStorehouseType" dictCode="out_storehouse_type" />
                      </a-form-model-item>
                    </a-col>
                  </a-row>
                  <a-row>
                    <a-col :span='span'>
                      <a-form-model-item label='出库时间' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='outboundTime'>
                        <j-date :disabled="coldisabled" v-model="tableRowRecord.outboundTime" :show-time="true" dateFormat="YYYY-MM-DD HH:mm" style="width: 100%"/>
                      </a-form-model-item>
                    </a-col>
                    <a-col :span='span'>
                      <a-form-model-item label='领用事由' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='subjectMatter'>
                        <a-input :disabled='coldisabled' v-model='tableRowRecord.subjectMatter'></a-input>
                      </a-form-model-item>
                    </a-col>
                  </a-row>
                  <a-row>
                    <a-col :span='span'>
                      <a-form-model-item label='经手人' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='handler'>
                        <a-input :disabled='coldisabled' v-model='tableRowRecord.handler_dictText'></a-input>
                      </a-form-model-item>
                    </a-col>
                    <a-col :span='span'>
                      <a-form-model-item label='备注' :labelCol='labelCol' :wrapperCol='wrapperCol' prop='remark'>
                        <a-textarea :disabled="coldisabled" v-model="tableRowRecord.remark" rows="4" />
                      </a-form-model-item>
                    </a-col>
                  </a-row>
                </a-form-model>
              </a-tab-pane>
              <a-tab-pane key='2' tab='申请明细信息'>
                <a-table
                  ref="table"
                  size="middle"
                  bordered
                  rowKey="id"
                  :scroll="{x:'max-content'}"
                  :columns="columns"
                  :dataSource="dataSource"
                  :pagination="ipagination"
                  :loading="loading"
                  :rowSelection="null">
                </a-table>
              </a-tab-pane>
              <a-tab-pane key='3' tab='流程节点'>
                <a-timeline>
                  <a-timeline-item v-for="(item,index) in hitaskDataSource" :key="index">
                    <div>
                      <h3 style="font-weight: bold;">{{item.taskName}}</h3>
                      <div>处理人:{{item.assignee_dictText}}</div>
                      <div v-if="index !==0">处理时长:{{item.duration}}</div>
                      <div v-if="item.name !== '提交申请'">处理类型:{{item.sequenceFlowName}}</div>
                      <div v-if="item.description">处理意见:{{item.description}}</div>
                    </div>
                  </a-timeline-item>
                </a-timeline>
              </a-tab-pane>
            </a-tabs>
          </a-spin>
        </a-form>
      </div>
      <div v-if="auditVisible">
        <hr class="shallow-hr">
        <br>
        <b>审批详情</b>
        <br>
        <a-form-model ref="form" :model="approveData" :rules="validatorRules" slot="detail">
          <a-row>
            <a-col ::span='span'>
              <a-form-model-item  label="申请人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop='handler_dictText'>
                <a-input :disabled='coldisabled' v-model='tableRowRecord.handler_dictText'></a-input>
              </a-form-model-item >
            </a-col>
            <a-col ::span='span'>
              <a-form-model-item  label="申请时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="createTime">
                <a-input :disabled='coldisabled' v-model='tableRowRecord.createTime'></a-input>
              </a-form-model-item >
            </a-col>
            <a-col :span="24" class="btxx">
              <a-form-item label="审批状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
                <a-select v-model='assignFileStream.status' placeholder="请选择审批结果">
                  <a-select-option value="3">通过</a-select-option>
                  <a-select-option value="4">驳回</a-select-option>
                </a-select>
              </a-form-item>
            </a-col>
            <a-col :span="24" class="btxx">
              <a-form-model-item  label="审批意见" :labelCol="labelCol" :wrapperCol="wrapperCol">
                <a-textarea v-model="assignFileStream.approvalOpinion" rows="4" placeholder="请输入审批意见"/>
              </a-form-model-item >
            </a-col>
          </a-row>
          <div class="table-operator" style="text-align: right;">
            <a-button  @click="handleQueXiaoTask" type="primary" icon="close">取消</a-button>
            <a-button @click="submitForm">提 äº¤</a-button>
          </div>
        </a-form-model>
      </div>
    </a-card>
  </a-modal>
</template>
<script>
import '@assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { getAction, deleteAction, postAction, downFile, httpAction } from '@api/manage'
export default {
  name: 'FlowShenPi',
  mixins: [mixinDevice],
  props: {
    selectShenpiData: {
      type: Object,
      required: true
    }
  },
  data() {
    return {
      form: this.$form.createForm(this),
      span: 12,
      span1: 8,
      coldisabled: true,
      spinning: false,
      tableRowRecord: {},
      assignFileStream:{},
      tableDataSource: [],
      usageDataSource: [],
      hitaskDataSource:[],
      dataSource: [],
      bomForm: {},
      imageSrc: null,
      drawerVisible: true,
      auditVisible: true,
      loading: false,
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 }
      },
      wrapperCol: {
        xs: { span: 30 },
        sm: { span: 16 }
      },
      /* åˆ†é¡µå‚æ•° */
      ipagination:{
        current: 1,
        pageSize: 5,
        pageSizeOptions: ['5', '10', '50'],
        showTotal: (total, range) => {
          return range[0] + "-" + range[1] + " å…±" + total + "条"
        },
        showQuickJumper: true,
        showSizeChanger: true,
        total: 0
      },
      columns: [
        {
          title: '#',
          dataIndex: '',
          key:'rowIndex',
          width:60,
          align:"center",
          customRender:function (t,r,index) {
            return parseInt(index)+1;
          }
        },
        {
          title:'工具编码',
          align:"left",
          dataIndex: 'toolNum'
        },
        {
          title:'工具编号',
          align:"left",
          dataIndex: 'toolId'
        },
        {
          title:'工具类型',
          align:"center",
          dataIndex: 'applicationType_dictText'
        },
        {
          title:'中文名称',
          align:"center",
          dataIndex: 'chineseName'
        },
        {
          title:'型号/图号',
          align:"left",
          dataIndex: 'toolModel'
        },
        {
          title:'刀具材料',
          align:"center",
          dataIndex: 'toolMaterial'
        },
        {
          title:'零件材料',
          align:"center",
          dataIndex: 'partMaterial'
        },
        {
          title:'厂家',
          align:"center",
          dataIndex: 'supplierId'
        },
        {
          title:'仓库',
          align:"center",
          dataIndex: 'warehouseName'
        },
        {
          title:'出库库位',
          align:"center",
          dataIndex: 'outboundLocation'
        },
        {
          title:'可用库存数量',
          align:"left",
          dataIndex: 'quantity'
        },
        {
          title:'申请出库数量',
          align:"left",
          dataIndex: 'outboundQuantity'
        },
        {
          title:'创建时间',
          align:"left",
          dataIndex: 'createTime'
        }
      ],
      validatorRules: {
        status: {
          rules: [
            { required: true, message: '请选择审批状态!'},
          ]
        },
      },
      approveData: {},
      flowData: {},
      title: '审批页面',
      width: 1200,
      visible: false,
      // è¡¨å¤´
      url: {
        queryOutBoundOrder: '/tms/outboundOrder/queryById',
        queryOutBoundDetailList: '/tms/outboundOrder/listOutboundDetailByMainId',
        diagramView: '/assign/flow/diagramView',
        queryHisTaskList:'/assign/flow/queryHisTaskList',
        approve:"/tms/outboundOrder/approval",
      },
      dictOptions: {},
      superFieldList: [],
      workflowSource: []
    }
  },
  created() {
  },
  computed: {},
  methods: {
    callback() {
    },
    handCancel() {
      this.visible = false
    },
    clearTableSource() {
      this.tableDataSource = []
      this.usageDataSource = []
    },
    fetchAndShowBmp() {
      console.log('flowData----->', this.flowData)
      try {
        let parm = {
          processDefinitionId: this.flowData.processDefinitionId,
          processInstanceId:this.flowData.processInstanceId,
          TaskDefinitionKey:this.flowData.processDefinitionKey
        }
        downFile(this.url.diagramView,parm,'get').then((res=>{
          console.log('Pica------>',res)
          const urlObject = window.URL.createObjectURL(new Blob([res]))
          this.imageSrc = urlObject
        }))
      } catch (error) {
        console.error('Error fetching image blob:', error)
        alert('无法加载图片,请稍后再试。')
      }
    },
    handleQueXiaoTask(){
      this.visible = false
      this.routeReload()
    },
    submitForm () {
      const that = this;
      if (!that.assignFileStream.status==null || that.assignFileStream.status===undefined){
        this.$message.warning('请选择审批状态!')
        return false;
      }
      if (!that.assignFileStream.approvalOpinion==null || that.assignFileStream.approvalOpinion===undefined) {
        this.$message.warning('请输入审批意见!')
        return false;
      }
      // è§¦å‘表单验证
      this.form.validateFields((err, values) => {
        if (!err) {
          that.confirmLoading = true;
          let url=this.url.approve
          let method = 'post';
          let flowTaskVo = {}
          flowTaskVo.status=that.assignFileStream.status;
          flowTaskVo.approvalOpinion =that.assignFileStream.approvalOpinion;
          flowTaskVo.comment =that.assignFileStream.approvalOpinion;
          flowTaskVo.dataId = this.selectShenpiData.dataId
          flowTaskVo.taskId = this.selectShenpiData.id
          flowTaskVo.userId = this.selectShenpiData.assignee
          flowTaskVo.instanceId = this.selectShenpiData.procInstId
          flowTaskVo.targetKey = this.selectShenpiData.taskDefKey
          flowTaskVo.values = this.selectShenpiData.variables
          flowTaskVo.assignee = this.selectShenpiData.assignee
          console.log("表单提交数据",flowTaskVo)
          httpAction(url,flowTaskVo,method).then((res)=>{
            if(res.success){
              that.$message.success(res.message);
              that.visible = false
              //刷新表格
              that.$emit('searchReset')
            }else{
              that.$message.warning(res.message);
            }
          }).finally(() => {
            that.confirmLoading = false;
          })
        }
      })
    },
    getAllApproveData(item) {
      this.visible = true
      this.loading = true
      console.log('selectShenpiData----->', this.selectShenpiData)
      this.flowData = item
      getAction(this.url.queryHisTaskList, {procInstId: item.procInstId}).then(res=>{
        if(res.success){
          this.hitaskDataSource = res.result
        }
      })
      getAction(this.url.queryOutBoundOrder, {id: item.dataId}).then((res => {
        if (res.success) {
          this.tableRowRecord = res.result
        }
      }))
      getAction(this.url.queryOutBoundDetailList, {outStorehouseId: item.dataId}).then(res => {
        if (res.success) {
          this.dataSource = res.result.records
          if (res.result.total) {
            this.ipagination.total = res.result.total
          } else {
            this.ipagination.total = 0
          }
        } else {
          this.$message.warning(res.message)
        }
      }).finally(() => {
        this.loading = false
      })
    }
  }
}
</script>
<style scoped>
.shallow-hr {
  border: 0;
  height: 1px; /* åˆ†ç•Œçº¿çš„高度 */
  background-color: rgba(0, 0, 0, 0.1); /* ä½¿ç”¨ RGBA é¢œè‰²ï¼Œå¹¶è®¾ç½®è¾ƒä½Žçš„透明度 */
  margin: 20px 0; /* åˆ†ç•Œçº¿ä¸Šä¸‹çš„外边距 */
}
.btn-custom {
  background-color: #4CAF50; /* ç»¿è‰²èƒŒæ™¯ */
  color: white; /* ç™½è‰²æ–‡å­— */
  border: none; /* æ— è¾¹æ¡† */
  padding: 5px 15px; /* å†…边距 */
  text-align: center; /* æ–‡å­—居中 */
  text-decoration: none; /* æ— ä¸‹åˆ’线 */
  display: inline-block; /* è¡Œå†…块元素 */
  font-size: 12px; /* å­—体大小 */
  margin: 4px 2px; /* å¤–边距 */
  cursor: pointer; /* é¼ æ ‡æ‚¬åœæ—¶æ˜¾ç¤ºæ‰‹åž‹ */
  border-radius: 4px; /* åœ†è§’边框 */
}
.bold-large-label {
  font-weight: bold;
  font-size: 20px; /* æˆ–你需要的任何大小 */
}
.left_qiu{
  position: absolute;
  left: -74px;
  top: 0;
  width:54px;
  border-radius: 50%;
  height:54px;
  font-size: 13px;
  margin: auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  background: #0099ff;
  transform: translate(0, 0);
}
/deep/ .ant-timeline-item-tail{
  left: -29px !important;
}
.left_qiu span{
  width: 3em;
  display: block;
  color: #fff;
  text-align: center;
}
.img{
  width: 75%;
}
.wrap{
  clear: both;
  width: 100%;
  display: flex;
  height: 50px;
  border: 1px solid #ccc;
  /* background-color: aqua; */
}
.box{
  width:21%;
  height:50px;
  border-right: 1px solid #ccc;
  line-height: 50px;
  /* background: red; */
  text-align:center;
  margin: auto;
}
@import '~@assets/less/common.less';
</style>
src/views/tms/OutboundDetailList.vue
@@ -131,9 +131,14 @@
            }
          },
          {
            title:'刀具编码',
            align:"center",
            title:'工具编码',
            align:"left",
            dataIndex: 'toolNum'
          },
          {
            title:'工具编号',
            align:"left",
            dataIndex: 'toolId'
          },
          {
            title:'工具类型',
@@ -147,7 +152,7 @@
          },
          {
            title:'型号/图号',
            align:"center",
            align:"left",
            dataIndex: 'toolModel'
          },
          {
@@ -176,13 +181,18 @@
            dataIndex: 'outboundLocation'
          },
          {
            title:'可用库存数量',
            align:"left",
            dataIndex: 'quantity'
          },
          {
            title:'申请出库数量',
            align:"center",
            align:"left",
            dataIndex: 'outboundQuantity'
          },
          {
            title:'实际出库数量',
            align:"center",
            align:"left",
            dataIndex: 'outActualCount'
          },
          {
@@ -192,7 +202,7 @@
          },
          {
            title:'创建时间',
            align:"center",
            align:"left",
            dataIndex: 'createTime'
          },
          // {
src/views/tms/OutboundOrderList.vue
@@ -154,7 +154,7 @@
          },
          {
            title:'出库单编号',
            align:"center",
            align:"left",
            dataIndex: 'outNum'
          },
          {
@@ -174,7 +174,7 @@
          },
          {
            title:'审核时间',
            align:"center",
            align:"left",
            dataIndex: 'auditDate'
          },
          {
@@ -184,7 +184,7 @@
          },
          {
            title:'申请出库时间',
            align:"center",
            align:"left",
            dataIndex: 'outboundTime'
          },
          {
@@ -209,7 +209,7 @@
          },
          {
            title:'创建时间',
            align:"center",
            align:"left",
            dataIndex: 'createTime'
          },
          {
src/views/tms/modules/outBound/OutboundOrderModal.vue
@@ -37,7 +37,7 @@
        <a-row>
          <a-col :span="12">
            <a-form-model-item label="审核人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="reviewer">
              <j-select-user-by-dep :disabled="disableSubmit" v-model="model.reviewer" :store="'id'" :text="'realname'" :multi="false" />
              <j-select-user-by-dep :disabled="disableSubmit" v-model="model.reviewer" :store="'username'" :text="'realname'" :multi="false" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">