1、保养规范审批流程根据规范分类区分展示保养项明细
2、调整二保批量新增功能
已修改4个文件
360 ■■■■ 文件已修改
src/views/eam/base/EamMaintenanceStandardList.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/maintenance/EamSecondMaintenanceOrderList.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue 211 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/workflow/MaintenanceStandard/MaintenanceStandardApprovalModal.vue 131 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/base/EamMaintenanceStandardList.vue
@@ -308,7 +308,6 @@
        dataIndex: 'action',
        align: 'center',
        scopedSlots: { customRender: 'action' },
        width: 200,
        fixed: 'right'
      }
      this.columns = [...this.columns, operationColumn]
src/views/eam/maintenance/EamSecondMaintenanceOrderList.vue
@@ -39,7 +39,8 @@
    <!-- 操作按钮区域 -->
    <div class="table-operator" v-if="isDisplayOperation">
      <a-button v-has="'secondMaintenanceOrder:add'" @click="handleAdd" type="primary" icon="plus">新增</a-button>
      <a-button v-has="'secondMaintenanceOrder:batchAdd'" @click="handleBatchAdd" type="primary" icon="plus">批量新增</a-button>
      <a-button v-has="'secondMaintenanceOrder:batchAdd'" @click="handleBatchAdd" type="primary" icon="plus">批量新增
      </a-button>
      <a-dropdown v-if="selectedRowKeys.length > 0">
        <a-menu slot="overlay">
          <a-menu-item v-has="'secondMaintenanceOrder:batchAbolish'" key="1" @click="handlerBatchAbolish">
@@ -79,7 +80,8 @@
            <a-divider v-has="'secondMaintenanceOrder:edit'" type="vertical"/>
            <a-popconfirm v-has="'secondMaintenanceOrder:collect'" title="确定领取吗?" @confirm="() => handlerCollect(record.id)">
            <a-popconfirm v-has="'secondMaintenanceOrder:collect'" title="确定领取吗?"
                          @confirm="() => handlerCollect(record.id)">
              <a>领取</a>
            </a-popconfirm>
@@ -89,7 +91,8 @@
            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
            <a-menu slot="overlay">
              <a-menu-item>
                <a-popconfirm v-has="'secondMaintenanceOrder:abolish'" title="确定作废吗?" @confirm="() => handlerAbolish(record.id)">
                <a-popconfirm v-has="'secondMaintenanceOrder:abolish'" title="确定作废吗?"
                              @confirm="() => handlerAbolish(record.id)">
                  <a>作废</a>
                </a-popconfirm>
              </a-menu-item>
@@ -104,9 +107,11 @@
            <a @click="handleDetail(record)">详情</a>
            <a-divider v-has="'secondMaintenanceOrder:restore'" v-if="record.maintenanceStatus === 'ABOLISH'" type="vertical"/>
            <a-divider v-has="'secondMaintenanceOrder:restore'" v-if="record.maintenanceStatus === 'ABOLISH'"
                       type="vertical"/>
            <a-popconfirm v-has="'secondMaintenanceOrder:restore'"  v-if="record.maintenanceStatus === 'ABOLISH'" title="确定还原吗?" @confirm="() => handlerRestore(record.id)">
            <a-popconfirm v-has="'secondMaintenanceOrder:restore'" v-if="record.maintenanceStatus === 'ABOLISH'"
                          title="确定还原吗?" @confirm="() => handlerRestore(record.id)">
              <a>还原</a>
            </a-popconfirm>
@@ -289,7 +294,7 @@
    methods: {
      handleBatchAdd() {
        this.$refs.batchModalForm.title = '批量新增'
        this.$refs.batchModalForm.visible = true
        this.$refs.batchModalForm.add()
      },
      /**
src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue
@@ -1,17 +1,25 @@
<template>
  <j-modal :title="title" :width="1200" :visible="visible" :confirmLoading="confirmLoading" switchFullscreen centered
  <j-modal :title="title" :visible="visible" :confirmLoading="confirmLoading" fullscreen
           :mask-closable="false" @ok="handleOk" @cancel="handleCancel" cancelText="关闭">
    <a-spin :spinning="spinning">
      <j-vxe-table ref="editableDetailTable" rowNumber rowSelection bordered alwaysEdit toolbar
                   :toolbarConfig="detail.toolbarConfig" keep-source :height="500"
                   :dataSource="detail.dataSource" :columns="detail.columns">
        <!--统一编码-->
        <template v-slot:equipmentId="props">
          <maintenance-equipment-select placeholder="请输入统一编码或名称搜索" v-model="props.row.equipmentId"
                                        maintenanceCategory="SECOND_MAINTENANCE" :allowClear="false"
                                        @autocompleteForm="autocompleteForm($event,props.row)"/>
        </template>
      <a-row :gutter="48">
        <a-col :span="6">
          <a-tabs default-active-key="1">
            <a-tab-pane tab="设备结构树" key="1">
              <a-tree showLine ref="tree" :expandedKeys.sync="expandedKeys"
                      :treeData="treeDataSource" checkable @check="onCheck" v-model="checkedKeys"
                      @expand="onExpand" @select="handleTreeNodeSelect">
              </a-tree>
            </a-tab-pane>
          </a-tabs>
        </a-col>
        <a-col :span="18">
          <a-tabs default-active-key="1">
            <a-tab-pane tab="设备明细" key="1">
              <j-vxe-table ref="editableDetailTable" rowNumber rowSelection bordered alwaysEdit keep-source
                           :height="500" :dataSource="detail.dataSource" :columns="detail.columns"
                           @selectRowChange="handleTableSelectRowChange">
        <!-- 保养日期-->
        <template v-slot:maintenanceDate="props">
          <a-date-picker v-model="props.row.maintenanceDate" value-format="YYYY-MM-DD" :allow-clear="false"/>
@@ -22,6 +30,14 @@
          <a :disabled="!props.row.equipmentId" @click="handlePreviewDetail(props.row.standardId)">预览明细</a>
        </template>
      </j-vxe-table>
            </a-tab-pane>
            <a-date-picker slot="tabBarExtraContent" type="primary" value-format="YYYY-MM-DD" :allowClear="false"
                           @change="handleBatchSetDate"/>
          </a-tabs>
        </a-col>
      </a-row>
    </a-spin>
    <eam-second-maintenance-batch-order-detail-modal ref="detailModal"/>
@@ -29,58 +45,43 @@
</template>
<script>
  import { postAction } from '@/api/manage'
  import MaintenanceEquipmentSelect from '@views/eam/equipment/modules/MaintenanceEquipmentSelect.vue'
  import { getAction, postAction } from '@/api/manage'
  import { JVXETypes } from '@comp/jeecg/JVxeTable'
  import EamSecondMaintenanceBatchOrderDetailModal from './EamSecondMaintenanceBatchOrderDetailModal'
  export default {
    name: 'EamSecondMaintenanceBatchOrderModal',
    components: { EamSecondMaintenanceBatchOrderDetailModal, MaintenanceEquipmentSelect },
    components: { EamSecondMaintenanceBatchOrderDetailModal },
    data() {
      return {
        title: '操作',
        visible: false,
        confirmLoading: false,
        spinning: false,
        treeDataSource: [],
        checkedKeys: [],
        expandedKeys: [],
        selectedKeys: [],
        url: {
          batchAdd: '/eam/secondMaintenanceOrder/batchAdd'
          batchAdd: '/eam/secondMaintenanceOrder/batchAdd',
          getDeviceTree: '/eam/secondMaintenanceOrder/BatchTreeStructure'
        },
        detail: {
          dataSource: [],
          columns: [
            {
              title: 'ID',
              key: 'id',
              type: JVXETypes.hidden
            },
            {
              title: '工单号',
              key: 'orderNum',
              align: 'center',
              type: JVXETypes.inputNumber,
              disabled: true,
              placeholder: '${title}系统自动生成',
              width: 200
            },
            {
              title: '统一编码',
              key: 'equipmentId',
              key: 'equipmentCode',
              align: 'center',
              type: JVXETypes.slot,
              slotName: 'equipmentId',
              width: 300,
              validateRules: [
                { required: true, message: '请输入${title}或名称搜索' },
                { unique: true, message: '${title}不能重复' }
              ]
              type: JVXETypes.normal,
              width: 150
            },
            {
              title: '规范名称',
              key: 'standardName',
              align: 'center',
              type: JVXETypes.normal,
              width: 200
              width: 300
            },
            {
              title: '保养日期',
@@ -103,47 +104,141 @@
              key: 'remark',
              align: 'center',
              type: JVXETypes.textarea,
              placeholder: '请输入备注',
              width: 300
              placeholder: '请输入备注'
            },
            {
              title: '操作',
              align: 'center',
              type: JVXETypes.slot,
              width: 150,
              slotName: 'action',
              fixed: 'right'
              slotName: 'action'
            }
          ],
          toolbarConfig: {
            // prefix 前缀;suffix 后缀
            slot: ['prefix', 'suffix'],
            // add 新增按钮;remove 删除按钮;clearSelection 清空选择按钮
            btn: ['add', 'remove', 'clearSelection']
          }
          ]
        }
      }
    },
    methods: {
      add() {
        //初始化默认值
        this.model = { maintenancePeriod: 6 }
        this.visible = true
        this.editable = true
        this.detail.operatorMaintenanceList = this.detail.repairerMaintenanceList = []
        this.checkedKeys = this.detail.dataSource = []
        this.queryTreeData()
      },
      // 获取设备结构树
      queryTreeData() {
        this.spinning = true
        this.treeDataSource = []
        getAction(this.url.getDeviceTree)
          .then(res => {
            if (res.success) {
              this.allTreeKeys = []
              this.treeDataSource = res.result
              this.generateList(this.treeDataSource)
              this.expandedKeys = this.allTreeKeys
            } else {
              this.$notification.warning({
                message: '消息',
                description: res.message
              })
            }
          })
          .finally(() => {
            this.spinning = false
          })
      },
      /**
       * 预览设备规范明细
       * @param standardId
       */
      handlePreviewDetail(standardId) {
        this.$refs.detailModal.visible = true
        this.$refs.detailModal.loadStandardDetail(standardId)
      },
      autocompleteForm(selectObj, record) {
        this.$set(record, 'standardName', selectObj.standardName)
        this.$set(record, 'standardId', selectObj.id)
        this.$set(record, 'equipmentId', selectObj.equipmentId)
        this.$set(record, 'maintenancePeriod', selectObj.maintenancePeriod)
        this.$refs.editableDetailTable.validateTable()
      onExpand(expandedKeys) {
        this.expandedKeys = expandedKeys
        this.autoExpandParent = false
      },
      async onCheck(value, obj) {
        this.$refs.editableDetailTable.clearValidate()
        this.checkedKeys = value
        const childNodesList = obj.checkedNodes.filter(item => item.data.props.equipmentId).map(item => {
          return {
            ...item.data.props.dataRef,
            id: item.data.props.dataRef.key,
            equipmentId: item.data.props.dataRef.key,
            equipmentCode: item.data.props.dataRef.equipmentId,
            standardId: item.data.props.dataRef.maintenanceStandardId,
            standardName: item.data.props.dataRef.maintenanceStandardName,
            maintenancePeriod: 6
          }
        })
        if (childNodesList.length === 0) {
          this.detail.dataSource = []
          return
        }
        console.log('childNodesList', childNodesList)
        if (childNodesList.length > this.detail.dataSource.length) {
          childNodesList.forEach(childNode => {
            if (!(this.detail.dataSource.map(item => item.id).includes(childNode.id))) this.detail.dataSource.push(childNode)
          })
          console.log('detail+++++++++++', this.detail.dataSource)
        } else {
          const deleteList = []
          this.detail.dataSource.map(item => item.id).forEach(item => {
            if (!(childNodesList.map(childNode => childNode.id).includes(item))) deleteList.push(item)
          })
          deleteList.forEach(deleteItem => {
            this.detail.dataSource.splice(this.detail.dataSource.findIndex(item => item.id === deleteItem), 1)
          })
          console.log('deleteList', deleteList)
          console.log('detail----------', this.detail.dataSource)
        }
      },
      /**
       * 点击树节点时触发
       * @param selectedKeys
       * @param event
       */
      handleTreeNodeSelect(selectedKeys, event) {
        event.node.$el.childNodes[1].click()
      },
      /**
       * 递归树数据展开所有节点
       * @param data
       */
      generateList(data) {
        for (let i = 0; i < data.length; i++) {
          const node = data[i]
          const key = node.key
          this.allTreeKeys.push(key)
          if (node.children) {
            this.generateList(node.children)
          }
        }
      },
      handleBatchSetDate(value) {
        this.detail.dataSource.forEach((item, index, self) => {
          if (this.selectedKeys.includes(item.id)) this.$set(item, 'maintenanceDate', value)
        })
      },
      /**
       * 表格多选框发生改变时触发
       * @param {selectedRowIds} 表格中已选择的ID列表
       */
      handleTableSelectRowChange({ selectedRowIds }) {
        this.selectedKeys = selectedRowIds
        console.log('selectedKeys', this.selectedKeys)
      },
      async handleOk() {
src/views/flowable/workflow/MaintenanceStandard/MaintenanceStandardApprovalModal.vue
@@ -74,9 +74,10 @@
          </a-col>
          <a-col :span="10" class="scroll-col">
            <a-tabs default-active-key="1">
              <a-tab-pane key="1" tab="保养项明细">
                <j-vxe-table ref="editableDetailTable" bordered alwaysEdit keep-source :dataSource="detail.dataSource"
            <a-tabs v-model="activeTabKey">
              <template v-if="model.maintenanceCategory==='POINT_INSPECTION'">
                <a-tab-pane key="1" tab="日点检">
                  <j-vxe-table bordered alwaysEdit keep-source :dataSource="detail.dataSource1"
                             :columns="detail.columns">
                  <template v-slot:itemCategory="props">
                    <j-dict-select-tag v-model="props.row.itemCategory" :dict-code="encodedDictCode" disabled/>
@@ -84,13 +85,54 @@
                </j-vxe-table>
              </a-tab-pane>
                <a-tab-pane key="2" tab="周点检">
                  <j-vxe-table bordered alwaysEdit keep-source :dataSource="detail.dataSource2"
                               :columns="detail.columns">
                    <template v-slot:itemCategory="props">
                      <j-dict-select-tag v-model="props.row.itemCategory" :dict-code="encodedDictCode" disabled/>
                    </template>
                  </j-vxe-table>
                </a-tab-pane>
              </template>
              <template v-if="model.maintenanceCategory==='SECOND_MAINTENANCE'">
                <a-tab-pane key="1" tab="操作工">
                  <j-vxe-table bordered alwaysEdit keep-source :dataSource="detail.dataSource1"
                               :columns="detail.columns">
                    <template v-slot:itemCategory="props">
                      <j-dict-select-tag v-model="props.row.itemCategory" :dict-code="encodedDictCode" disabled/>
                    </template>
                  </j-vxe-table>
                </a-tab-pane>
                <a-tab-pane key="2" tab="维修工">
                  <j-vxe-table bordered alwaysEdit keep-source :dataSource="detail.dataSource2"
                               :columns="detail.columns">
                    <template v-slot:itemCategory="props">
                      <j-dict-select-tag v-model="props.row.itemCategory" :dict-code="encodedDictCode" disabled/>
                    </template>
                  </j-vxe-table>
                </a-tab-pane>
              </template>
              <template v-if="model.maintenanceCategory==='THIRD_MAINTENANCE'">
                <a-tab-pane key="1" tab="三保">
                  <j-vxe-table bordered alwaysEdit keep-source :dataSource="detail.dataSource1"
                               :columns="detail.columns">
                    <template v-slot:itemCategory="props">
                      <j-dict-select-tag v-model="props.row.itemCategory" :dict-code="encodedDictCode" disabled/>
                    </template>
                  </j-vxe-table>
                </a-tab-pane>
              </template>
              <template v-if="selectShenpiData.processDefinitionKey">
                <a-tab-pane key='2' tab='流程图'>
                <a-tab-pane key='3' tab='流程图'>
                  <img :src="imageSrc" alt="Fetched Image"/>
                </a-tab-pane>
              </template>
              <a-tab-pane key='3' tab='流转节点'>
              <a-tab-pane key='4' tab='流转节点'>
                <a-card>
                  <a-timeline style="padding:0 1% 0 12%" >
                    <a-timeline-item color='white' v-for="(item,index1) in hitaskDataSource" :key="index1">
@@ -192,6 +234,7 @@
          sm: { span: 16 }
        },
        visible: false,
        activeTabKey: '1',
        // 表头
        url: {
          diagramView: '/assign/flow/diagramView',
@@ -201,7 +244,8 @@
          detailList: '/eam/eamMaintenanceStandardDetail/queryList'
        },
        detail: {
          dataSource: [],
          dataSource1: [],
          dataSource2: [],
          columns: [],
          inspectionColumns: [
            {
@@ -218,16 +262,17 @@
              title: '项目序号',
              key: 'itemCode',
              type: JVXETypes.normal,
              align: 'center'
            },
            {
              title: '保养项分类',
              key: 'itemCategory',
              type: JVXETypes.slot,
              slotName: 'itemCategory',
              align: 'center',
              disabled: true
              width: 100
            },
            // {
            //   title: '保养项分类',
            //   key: 'itemCategory',
            //   type: JVXETypes.slot,
            //   slotName: 'itemCategory',
            //   align: 'center',
            //   disabled: true
            // },
            {
              title: '保养项目',
              key: 'itemName',
@@ -256,16 +301,17 @@
              title: '项目序号',
              key: 'itemCode',
              type: JVXETypes.normal,
              align: 'center'
            },
            {
              title: '保养项分类',
              key: 'itemCategory',
              type: JVXETypes.slot,
              slotName: 'itemCategory',
              align: 'center',
              disabled: true
              width: 100
            },
            // {
            //   title: '保养项分类',
            //   key: 'itemCategory',
            //   type: JVXETypes.slot,
            //   slotName: 'itemCategory',
            //   align: 'center',
            //   disabled: true
            // },
            {
              title: '保养项目',
              key: 'itemName',
@@ -350,6 +396,7 @@
       * @param record 主页面列表行记录
       */
      handleApprove(record) {
        this.activeTabKey = '1'
        this.getBasicInformationByApi(record)
        this.getFlowChartImageByApi(record)
        this.getFlowTaskListByApi(record)
@@ -360,15 +407,13 @@
       * @param record
       */
      getFlowTaskListByApi(record) {
        console.log("sss",record)
        let parmhis={
          'procInstId': record.procInstId
        }
        getAction(this.url.queryHisTaskList,parmhis).then(res=>{
          this.hitaskDataSource=res.result
        }).finally(
          this.visible = true,
          console.log('this.approveData---->', this.approveData)
          this.visible = true
        )
      },
@@ -377,7 +422,8 @@
       * @param record 主页面列表行记录
       */
      handleDetail(record) {
        this.detail.dataSource = []
        this.activeTabKey = '1'
        this.detail.dataSource1 = this.detail.dataSource2 = []
        this.model = Object.assign({}, record)
        this.getFlowTaskListByApi(record)
        this.loadDetail(record.id)
@@ -390,7 +436,7 @@
      getBasicInformationByApi(record) {
        this.spinning = true
        this.model = {}
        this.detail.dataSource = []
        this.detail.dataSource1 = this.detail.dataSource2 = []
        const that = this
        getAction(this.url.queryById, { id: record.dataId })
          .then(res => {
@@ -441,9 +487,26 @@
       * @param dataId 业务ID
       */
      loadDetail(dataId) {
        this.spinning = true
        getAction(this.url.detailList, { standardId: dataId })
          .then(res => {
            if (res.success) this.detail.dataSource = res.result
            if (res.success) {
              switch (this.model.maintenanceCategory) {
                case 'POINT_INSPECTION':
                  this.detail.dataSource1 = res.result.filter(item => item.itemCategory === 'DAY_INSPECTION')
                  this.detail.dataSource2 = res.result.filter(item => item.itemCategory === 'WEEK_INSPECTION')
                  break
                case 'SECOND_MAINTENANCE':
                  this.detail.dataSource1 = res.result.filter(item => item.itemCategory === 'OPERATOR_MAINTENANCE')
                  this.detail.dataSource2 = res.result.filter(item => item.itemCategory === 'REPAIRER_MAINTENANCE')
                  break
                case 'THIRD_MAINTENANCE':
                  this.detail.dataSource1 = res.result
                  break
                default:
                  break
              }
            }
          })
          .finally(() => {
            this.spinning = false
@@ -451,11 +514,6 @@
      },
      async submitForm() {
        let errMap = await this.$refs.editableDetailTable.validateTable()
        if (errMap) {
          return
        }
        this.$refs.form.validate(valid => {
          if (valid) {
            this.confirmLoading = this.spinning = true
@@ -517,6 +575,7 @@
      }
    }
  }
  /* 全局禁选样式 - 作用于整个页面 */
  html.submitting,
  html.submitting body {
@@ -562,6 +621,7 @@
    background-color: rgba(0, 0, 0, 0.1); /* 使用 RGBA 颜色,并设置较低的透明度 */
    margin: 20px 0; /* 分界线上下的外边距 */
  }
  .btn-custom {
    background-color: #4CAF50; /* 绿色背景 */
    color: white; /* 白色文字 */
@@ -580,6 +640,7 @@
    font-weight: bold;
    font-size: 20px; /* 或你需要的任何大小 */
  }
  .left_qiu{
    position: absolute;
    left: -74px;
@@ -596,15 +657,18 @@
    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%;
  }
@@ -617,6 +681,7 @@
    border: 1px solid #ccc;
    /* background-color: aqua; */
  }
  .box{
    width:21%;
    height:50px;