Houjie
2025-05-23 6232ac30ca4f54e28ddeccdf5aca03734d02aada
库存预警界面/ 工具盘点功能/工具盘点/刀具刃磨
已添加16个文件
已修改1个文件
4998 ■■■■■ 文件已修改
src/views/flowable/workflow/FlowTodo.vue 686 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/workflow/lossBound/lossBoundHandle.vue 499 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/lossBound/LossboundDetailList.vue 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/lossBound/LossboundList.vue 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/lossBound/modules/JSelectLossboundToolModal.vue 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/lossBound/modules/LossboundDetailModal.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/lossBound/modules/LossboundModal.vue 427 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/requirement/ToolSharpeningList .vue 302 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/requirement/modules/ToolsModal.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/requirement/modules/ToolsSharpeningModal.vue 385 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/stocktakingBound/ToolsStocktaKingBoundDetail.vue 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/stocktakingBound/ToolsStocktakingBoundList.vue 321 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/stocktakingBound/modules/ToolSelectorModal.vue 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/stocktakingBound/modules/ToolsStocktakingBoundModal.vue 504 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/storeEarlyWarning/ToolsStoreEarlyWarningList.vue 303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningForm.vue 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningModal.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/flowable/workflow/FlowTodo.vue
@@ -50,7 +50,7 @@
              <a-button @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
               <a @click="handleToggleSearch" style="margin-left: 8px">
                {{ toggleSearchStatus ? '收起' : '展开' }}
                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
                <a-icon :type="toggleSearchStatus ? 'up' : 'down'" />
              </a>
            </span>
          </a-col>
@@ -64,12 +64,12 @@
      <a-dropdown v-if="selectedRowKeys.length > 0 ">
        <a-menu slot="overlay">
          <a-menu-item key="1" @click="batchHandle">
            <a-icon type="delete"/>
            <a-icon type="delete" />
            æ‰¹é‡å¤„理
          </a-menu-item>
        </a-menu>
        <a-button style="margin-left: 8px"> æ‰¹é‡æ“ä½œ
          <a-icon type="down"/>
          <a-icon type="down" />
        </a-button>
      </a-dropdown>
    </div>
@@ -78,7 +78,7 @@
    <div>
      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
        <i class="anticon anticon-info-circle ant-alert-icon"></i>已选择&nbsp;<a style="font-weight: 600">{{
        selectedRowKeys.length }}</a>项&nbsp;&nbsp;
          selectedRowKeys.length }}</a>项&nbsp;&nbsp;
        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
      </div>
@@ -101,9 +101,12 @@
      </a-table>
    </div>
    <AssignFileStreamHandle ref="modalFormApproval" :selectShenpiData="selectShenpiData" @searchReset="searchReset"></AssignFileStreamHandle>
    <DispatchFileHandle ref="modalFormDispatchFileXq"  :selectShenpiData="selectDispatchFileXqData" @searchReset="searchReset"></DispatchFileHandle>
    <DispatchFileBachHandleStyle ref="modalFormDispatchFileBatch" @searchReset="searchReset" @ok="modalFormOk"></DispatchFileBachHandleStyle>
    <AssignFileStreamHandle ref="modalFormApproval" :selectShenpiData="selectShenpiData"
                            @searchReset="searchReset"></AssignFileStreamHandle>
    <DispatchFileHandle ref="modalFormDispatchFileXq" :selectShenpiData="selectDispatchFileXqData"
                        @searchReset="searchReset"></DispatchFileHandle>
    <DispatchFileBachHandleStyle ref="modalFormDispatchFileBatch" @searchReset="searchReset"
                                 @ok="modalFormOk"></DispatchFileBachHandleStyle>
    <!--单个流程处理-->
    <InspectionOrderHandle ref="modalFormInspectionOrder" :selectShenpiData="selectInspectionOrderData"
                           @searchReset="searchReset"></InspectionOrderHandle>
@@ -112,354 +115,391 @@
    <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>
                            @searchReset="searchReset"></out-bound-order-handle>
    <stocktaking-bound-handle   ref="stocktakingBoundHandle" :selectShenpiData="selectStocktakingBoundOrderData" @searchReset="searchReset"></stocktaking-bound-handle>
    <loss-bound-handle ref="lossBoundHandle" :selectShenpiData="selectLossBoundOrderData"
                       @searchReset="searchReset"></loss-bound-handle>
<!--    <loss-bound-handle ref="lossBoundHandle" :selectShenpiData="selectLossBoundOrderData"-->
<!--                       @searchReset="searchReset"></loss-bound-handle>-->
    <!--批量处理-->
    <inspection-order-batch-handle ref="inspectionOrderBatchHandleRef" @searchReset="searchReset"
                                   :taskList="selectionRows"/>
                                   :taskList="selectionRows" />
    <week-maintenance-batch-approval-modal ref="weenMaintenanceBatchApprovalModalRef" @searchReset="searchReset"
                                           :taskList="selectionRows"/>
    <equipment-lean-out-approval-modal ref="equipmentLeanOutApprovalModelRef" @searchReset="searchReset"/>
                                           :taskList="selectionRows" />
    <equipment-lean-out-approval-modal ref="equipmentLeanOutApprovalModelRef" @searchReset="searchReset" />
    <second-maintenance-approval-modal ref="secondMaintenanceApprovalModal" :selectShenpiData="selectSecondMaintenanceData"
                                     @searchReset="searchReset"></second-maintenance-approval-modal>
    <second-maintenance-approval-modal ref="secondMaintenanceApprovalModal"
                                       :selectShenpiData="selectSecondMaintenanceData"
                                       @searchReset="searchReset"></second-maintenance-approval-modal>
    <third-maintenance-approval-modal ref="thirdMaintenanceApprovalModal" :selectShenpiData="selectThirdMaintenanceData"
                                       @searchReset="searchReset"></third-maintenance-approval-modal>
    <equipment-seal-up-approval-modal ref="equipmentSealUpApprovalModelRef" @searchReset="searchReset"/>
                                      @searchReset="searchReset"></third-maintenance-approval-modal>
    <equipment-seal-up-approval-modal ref="equipmentSealUpApprovalModelRef" @searchReset="searchReset" />
  </a-card>
</template>
<script>
  import '@/assets/less/TableExpand.less'
  import { mixinDevice } from '@/utils/mixin'
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  import JDictSelectTag from '@/components/dict/JDictSelectTag.vue'
  import WeekMaintenanceApprovalModal from '@views/flowable/workflow/weekMaintenance/WeekMaintenanceApprovalModal'
  import RepairOrderApprovalModal from '@views/flowable/workflow/repairOrder/RepairOrderApprovalModal'
  import InspectionOrderHandle from '@views/flowable/workflow/InspectionOrder/InspectionOrderHandle.vue'
import '@/assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import JDictSelectTag from '@/components/dict/JDictSelectTag.vue'
import WeekMaintenanceApprovalModal from '@views/flowable/workflow/weekMaintenance/WeekMaintenanceApprovalModal'
import RepairOrderApprovalModal from '@views/flowable/workflow/repairOrder/RepairOrderApprovalModal'
import InspectionOrderHandle from '@views/flowable/workflow/InspectionOrder/InspectionOrderHandle.vue'
  import { getAction } from '@api/manage'
  import InspectionOrderBatchHandle from './InspectionOrder/InspectionOrderBatchHandle'
  import WeekMaintenanceBatchApprovalModal from './weekMaintenance/WeekMaintenanceBatchApprovalModal'
  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'
  import EquipmentSealUpApprovalModal from '@views/flowable/workflow/sealUp/EquipmentSealUpApprovalModal.vue'
  export default {
    name: 'NcDeviceCharactersList',
    mixins: [JeecgListMixin, mixinDevice],
    components: {
      AssignFileStreamHandle,
      DispatchFileHandle,
      DispatchFileBachHandleStyle,
      WeekMaintenanceBatchApprovalModal,
      InspectionOrderBatchHandle,
      JDictSelectTag,
      WeekMaintenanceApprovalModal,
      RepairOrderApprovalModal,
      InspectionOrderHandle,
      EquipmentLeanOutApprovalModal,
      SecondMaintenanceApprovalModal,
      ThirdMaintenanceApprovalModal,
      OutBoundOrderHandle,
      EquipmentSealUpApprovalModal,
    },
    data() {
      return {
        description: '工作流-我的待办',
        // è¡¨å¤´
        columns: [
          {
            title: '序号',
            dataIndex: '',
            key: 'rowIndex',
            width: 60,
            align: 'center',
            customRender: function(t, r, index) {
              return parseInt(index) + 1
            }
          },
          {
            title: '流程分类',
            align: 'center',
            dataIndex: 'category_dictText'
          },
          {
            title: '流程名称',
            align: 'center',
            dataIndex: 'flowName',
            width: 200
          },
          {
            title: '流程业务简要描述',
            align: 'center',
            dataIndex: 'description',
            width: 350,
            ellipsis: true
import { getAction } from '@api/manage'
import InspectionOrderBatchHandle from './InspectionOrder/InspectionOrderBatchHandle'
import WeekMaintenanceBatchApprovalModal from './weekMaintenance/WeekMaintenanceBatchApprovalModal'
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'
import EquipmentSealUpApprovalModal from '@views/flowable/workflow/sealUp/EquipmentSealUpApprovalModal.vue'
import stocktakingBoundHandle from '@views/flowable/workflow/stocktakingBound/stocktakingBoundHandle.vue'
import lossBoundHandle from '@views/flowable/workflow/lossBound/lossBoundHandle.vue'
          },
          {
            title: '上一步处理人',
            align: 'center',
            dataIndex: 'preNodeAssignee_dictText',
            width: 150
          },
          {
            title: '前驱节点',
            align: 'center',
            dataIndex: 'preNode',
            width: 200
          },
          {
            title: '当前节点',
            align: 'center',
            dataIndex: 'name',
            width: 200
          },
          {
            title: '当前节点开始时间',
            align: 'center',
            dataIndex: 'createTime',
            width: 200
          },
          {
            title: '操作',
            dataIndex: 'action',
            scopedSlots: { customRender: 'action' },
            align: 'center',
            width: 150,
            fixed: 'right'
export default {
  name: 'NcDeviceCharactersList',
  mixins: [JeecgListMixin, mixinDevice],
  components: {
    lossBoundHandle,
    stocktakingBoundHandle,
    AssignFileStreamHandle,
    DispatchFileHandle,
    DispatchFileBachHandleStyle,
    WeekMaintenanceBatchApprovalModal,
    InspectionOrderBatchHandle,
    JDictSelectTag,
    WeekMaintenanceApprovalModal,
    RepairOrderApprovalModal,
    InspectionOrderHandle,
    EquipmentLeanOutApprovalModal,
    SecondMaintenanceApprovalModal,
    ThirdMaintenanceApprovalModal,
    OutBoundOrderHandle,
    EquipmentSealUpApprovalModal
  },
  data() {
    return {
      description: '工作流-我的待办',
      // è¡¨å¤´
      columns: [
        {
          title: '序号',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          }
        ],
        url: {
          list: '/assign/flow/toTaskBySelf',
          isSameNode: '/assign/flow/isSameNode'
        },
        dictOptions: {},
        selectShenpiData: {},
        selectDispatchFileXqData:{},
        selectInspectionOrderData: {},
        selectWeekMaintenanceData: {},
        selectSecondMaintenanceData: {},
        selectThirdMaintenanceData: {},
        selectBachData: {},
        selectRepairOrderData: {},
        selectOutBoundOrderData: {},
        //业务信息ID
        dataId: undefined
      }
    },
    created() {
    },
    computed: {
      importExcelUrl: function() {
        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
        {
          title: '流程分类',
          align: 'center',
          dataIndex: 'category_dictText'
        },
        {
          title: '流程名称',
          align: 'center',
          dataIndex: 'flowName',
          width: 200
        },
        {
          title: '流程业务简要描述',
          align: 'center',
          dataIndex: 'description',
          width: 350,
          ellipsis: true
        },
        {
          title: '上一步处理人',
          align: 'center',
          dataIndex: 'preNodeAssignee_dictText',
          width: 150
        },
        {
          title: '前驱节点',
          align: 'center',
          dataIndex: 'preNode',
          width: 200
        },
        {
          title: '当前节点',
          align: 'center',
          dataIndex: 'name',
          width: 200
        },
        {
          title: '当前节点开始时间',
          align: 'center',
          dataIndex: 'createTime',
          width: 200
        },
        {
          title: '操作',
          dataIndex: 'action',
          scopedSlots: { customRender: 'action' },
          align: 'center',
          width: 150,
          fixed: 'right'
        }
      ],
      url: {
        list: '/assign/flow/toTaskBySelf',
        isSameNode: '/assign/flow/isSameNode'
      },
      getTableColumnsTotalWidth() {
        return this.columns.reduce((total, item) => total + item.width, 0)
      }
      dictOptions: {},
      selectShenpiData: {},
      selectDispatchFileXqData: {},
      selectInspectionOrderData: {},
      selectWeekMaintenanceData: {},
      selectSecondMaintenanceData: {},
      selectThirdMaintenanceData: {},
      selectBachData: {},
      selectRepairOrderData: {},
      selectOutBoundOrderData: {},
      selectLossBoundOrderData: {},
      selectStocktakingBoundOrderData: {},
      //业务信息ID
      dataId: undefined
    }
  },
  created() {
  },
  computed: {
    importExcelUrl: function() {
      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
    },
    methods: {
      loadData(arg) {
        if (!this.url.list) {
          this.$message.error('请设置url.list属性!')
          return
        }
        //加载数据 è‹¥ä¼ å…¥å‚æ•°1则加载第一页的内容
        if (arg === 1) {
          this.ipagination.current = 1
        }
        var params = this.getQueryParams()//查询条件
        if (!params) {
          return false
        }
        this.loading = true
        getAction(this.url.list, params).then((res) => {
          if (res.success) {
            // console.log(res)
            //update-begin---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
            this.dataSource = res.result.records || res.result
            if (res.result.total) {
              this.ipagination.total = res.result.total
            } else {
              this.ipagination.total = 0
            }
            if (this.selectedRowKeys.length > 0) this.selectedRowKeys = this.selectionRows = []
            //update-end---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
    getTableColumnsTotalWidth() {
      return this.columns.reduce((total, item) => total + item.width, 0)
    }
  },
  methods: {
    loadData(arg) {
      if (!this.url.list) {
        this.$message.error('请设置url.list属性!')
        return
      }
      //加载数据 è‹¥ä¼ å…¥å‚æ•°1则加载第一页的内容
      if (arg === 1) {
        this.ipagination.current = 1
      }
      var params = this.getQueryParams()//查询条件
      if (!params) {
        return false
      }
      this.loading = true
      getAction(this.url.list, params).then((res) => {
        if (res.success) {
          // console.log(res)
          //update-begin---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
          this.dataSource = res.result.records || res.result
          if (res.result.total) {
            this.ipagination.total = res.result.total
          } else {
            this.$message.warning(res.message)
            this.ipagination.total = 0
          }
        }).finally(() => {
          this.loading = false
          if (this.selectedRowKeys.length > 0) this.selectedRowKeys = this.selectionRows = []
          //update-end---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
        } else {
          this.$message.warning(res.message)
        }
      }).finally(() => {
        this.loading = false
      })
    },
    handelDetail(item, index) {
      console.log('点击了详情')
      console.log('item----->', item)
      console.log('index----->', index)
      let processType = this.splitAprocessType(item.category)
      console.log('processType--->', processType)
      switch (processType) {
        case 'drApproval':
          this.handDrDetial(item)
          break
        case 'ggApproval':
          this.handDispatchFileDetial(item)
          break
        case 'sbdjApproval':
          this.handInspectionOrder(item)
          break
        case 'WEEK_MAINTENANCE':
          this.handleWeekMaintenance(item)
          break
        case 'eam_repair':
          this.handleRepairOrder(item)
          break
        case 'equipment_lean_out':
          this.handleEquipmentLeanOut(item)
          break
        case 'second_maintenance':
          this.handleSecondMaintenance(item)
          break
        case 'third_maintenance':
          this.handleThirdMaintenance(item)
          break
        case 'toolOutStorageApproval':
          this.handleToolOutStorageApproval(item)
          break
        case 'toolsStocktakingBound':
          this.handleToolStocktakingApproval(item)
          break
        case 'toolsLossApproval':
          this.handleToolLossApproval(item)
          break
        case 'equipment_seal_up':
          this.handleEquipmentSealUp(item)
          break
        default:
          alert('没找到该流程')
      }
    },
    batchHandle() {
      const categorySet = new Set(this.selectionRows.map(item => item.category))
      const nameSet = new Set(this.selectionRows.map(item => item.name))
      if (categorySet.size !== 1 || nameSet.size !== 1) {
        this.$notification.info({
          message: '消息',
          description: '请选择同一流程分类下的同一当前节点'
        })
      },
        return
      }
      handelDetail(item, index) {
        console.log('点击了详情')
        console.log('item----->', item)
        console.log('index----->', index)
        let processType = this.splitAprocessType(item.category)
        console.log('processType--->', processType)
        switch (processType) {
          case 'drApproval':
            this.handDrDetial(item)
            break
          case 'ggApproval':
            this.handDispatchFileDetial(item)
            break
          case 'sbdjApproval':
            this.handInspectionOrder(item)
            break
          case 'WEEK_MAINTENANCE':
            this.handleWeekMaintenance(item)
            break
          case 'eam_repair':
            this.handleRepairOrder(item)
            break
          case 'equipment_lean_out':
            this.handleEquipmentLeanOut(item)
            break
          case 'second_maintenance':
            this.handleSecondMaintenance(item)
            break
          case 'third_maintenance':
            this.handleThirdMaintenance(item)
            break
          case 'toolOutStorageApproval':
            this.handleToolOutStorageApproval(item)
            break
          case 'equipment_seal_up':
            this.handleEquipmentSealUp(item)
            break
          default:
            alert('没找到该流程')
        }
      },
      if (categorySet.has('eam_repair')) {
        this.$notification.info({
          message: '消息',
          description: '设备维修流程无法批量处理'
        })
        return
      }
      batchHandle() {
        const categorySet = new Set(this.selectionRows.map(item => item.category))
        const nameSet = new Set(this.selectionRows.map(item => item.name))
        if (categorySet.size !== 1 || nameSet.size !== 1) {
          this.$notification.info({
            message: '消息',
            description: '请选择同一流程分类下的同一当前节点'
          })
          return
        }
      if (categorySet.has('sbdjApproval')) {
        this.$refs.inspectionOrderBatchHandleRef.visible = true
        this.$refs.inspectionOrderBatchHandleRef.title = this.selectionRows[0].name
        this.$refs.inspectionOrderBatchHandleRef.getAllApproveData(this.selectionRows[0])
        this.$refs.inspectionOrderBatchHandleRef.getBasicInformation(this.selectionRows[0])
      } else if (categorySet.has('WEEK_MAINTENANCE')) {
        this.$refs.weenMaintenanceBatchApprovalModalRef.handleDetail(this.selectionRows[0])
        this.$refs.weenMaintenanceBatchApprovalModalRef.title = this.selectionRows[0].name
      }
    },
        if (categorySet.has('eam_repair')) {
          this.$notification.info({
            message: '消息',
            description: '设备维修流程无法批量处理'
          })
          return
        }
    splitAprocessType(title) {
      let parts = title.split(':') // æ³¨æ„å†’号是全角字符,使用对应的字进行分割
      let result = parts[0]
      return result
    },
        if (categorySet.has('sbdjApproval')) {
          this.$refs.inspectionOrderBatchHandleRef.visible = true
          this.$refs.inspectionOrderBatchHandleRef.title = this.selectionRows[0].name
          this.$refs.inspectionOrderBatchHandleRef.getAllApproveData(this.selectionRows[0])
          this.$refs.inspectionOrderBatchHandleRef.getBasicInformation(this.selectionRows[0])
        } else if (categorySet.has('WEEK_MAINTENANCE')) {
          this.$refs.weenMaintenanceBatchApprovalModalRef.handleDetail(this.selectionRows[0])
          this.$refs.weenMaintenanceBatchApprovalModalRef.title = this.selectionRows[0].name
        }
      },
    handDrDetial(item) {
      this.selectShenpiData = item
      this.$refs.modalFormApproval.clearTableSource()
      this.$refs.modalFormApproval.getAllApproveData(item)
    },
      splitAprocessType(title) {
        let parts = title.split(':') // æ³¨æ„å†’号是全角字符,使用对应的字进行分割
        let result = parts[0]
        return result
      },
    handDispatchFileDetial(item) {
      console.log('item----->', item)
      this.selectDispatchFileXqData = item
      this.$refs.modalFormDispatchFileXq.clearTableSource()
      this.$refs.modalFormDispatchFileXq.getAllApproveData(item)
    },
      handDrDetial(item) {
        this.selectShenpiData = item
        this.$refs.modalFormApproval.clearTableSource()
        this.$refs.modalFormApproval.getAllApproveData(item)
      },
    handInspectionOrder(record) {
      console.log('record----->', record)
      this.selectInspectionOrderData = Object.assign({}, record)
      this.$refs.modalFormInspectionOrder.visible = true
      this.$refs.modalFormInspectionOrder.title = record.name
      this.$refs.modalFormInspectionOrder.getAllApproveData(record)
      this.$refs.modalFormInspectionOrder.getBasicInformation(record)
    },
      handDispatchFileDetial(item){
        console.log('item----->', item)
        this.selectDispatchFileXqData = item
        this.$refs.modalFormDispatchFileXq.clearTableSource()
        this.$refs.modalFormDispatchFileXq.getAllApproveData(item)
      },
    handleWeekMaintenance(item) {
      if (item && item.dataId) {
        this.selectWeekMaintenanceData = Object.assign({}, item)
        this.$refs.weekMaintenanceApprovalModal.handleDetail(item)
        this.$refs.weekMaintenanceApprovalModal.title = item.name
        this.$refs.weekMaintenanceApprovalModal.disableSubmit = false
      }
    },
      handInspectionOrder(record) {
        console.log('record----->', record)
        this.selectInspectionOrderData = Object.assign({}, record)
        this.$refs.modalFormInspectionOrder.visible = true
        this.$refs.modalFormInspectionOrder.title = record.name
        this.$refs.modalFormInspectionOrder.getAllApproveData(record)
        this.$refs.modalFormInspectionOrder.getBasicInformation(record)
      },
    /**
     * ç‚¹å‡»è®¾å¤‡ç»´ä¿®åˆ†ç±»æµç¨‹è¯¦æƒ…时触发
     * @param record
     */
    handleRepairOrder(record) {
      this.selectRepairOrderData = Object.assign({}, record)
      this.$refs.repairOrderApprovalModal.visible = true
      this.$refs.repairOrderApprovalModal.title = record.name
      this.$refs.repairOrderApprovalModal.getAllApproveData(record)
      this.$refs.repairOrderApprovalModal.getBasicInformation(record)
    },
    handleEquipmentLeanOut(item) {
      this.$refs.equipmentLeanOutApprovalModelRef.visible = true
      this.$refs.equipmentLeanOutApprovalModelRef.title = item.name
      this.$refs.equipmentLeanOutApprovalModelRef.handleDetail(item)
      this.$refs.equipmentLeanOutApprovalModelRef.disableSubmit = false
    },
    handleSecondMaintenance(item) {
      if (item && item.dataId) {
        this.selectSecondMaintenanceData = Object.assign({}, item)
        this.$refs.secondMaintenanceApprovalModal.handleDetail(item)
        this.$refs.secondMaintenanceApprovalModal.title = item.name
        this.$refs.secondMaintenanceApprovalModal.disableSubmit = false
      }
    },
    handleThirdMaintenance(item) {
      if (item && item.dataId) {
        this.selectThirdMaintenanceData = Object.assign({}, item)
        this.$refs.thirdMaintenanceApprovalModal.handleDetail(item)
        this.$refs.thirdMaintenanceApprovalModal.title = item.name
        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)
      }
    },
    handleToolStocktakingApproval(item) {
      if (item && item.dataId) {
        this.selectStocktakingBoundOrderData = Object.assign({}, item)
        this.$refs.stocktakingBoundHandle.auditVisible = true
        this.$refs.stocktakingBoundHandle.clearTableSource()
        this.$refs.stocktakingBoundHandle.getAllApproveData(item)
      }
    },
    handleToolLossApproval(item) {
      if (item && item.dataId) {
        this.selectLossBoundOrderData = Object.assign({}, item)
        this.$refs.lossBoundHandle.auditVisible = true
        this.$refs.lossBoundHandle.clearTableSource()
        this.$refs.lossBoundHandle.getAllApproveData(item)
      }
    },
      handleWeekMaintenance(item) {
        if (item && item.dataId) {
          this.selectWeekMaintenanceData = Object.assign({}, item)
          this.$refs.weekMaintenanceApprovalModal.handleDetail(item)
          this.$refs.weekMaintenanceApprovalModal.title = item.name
          this.$refs.weekMaintenanceApprovalModal.disableSubmit = false
        }
      },
      /**
       * ç‚¹å‡»è®¾å¤‡ç»´ä¿®åˆ†ç±»æµç¨‹è¯¦æƒ…时触发
       * @param record
       */
      handleRepairOrder(record) {
        this.selectRepairOrderData = Object.assign({}, record)
        this.$refs.repairOrderApprovalModal.visible = true
        this.$refs.repairOrderApprovalModal.title = record.name
        this.$refs.repairOrderApprovalModal.getAllApproveData(record)
        this.$refs.repairOrderApprovalModal.getBasicInformation(record)
      },
      handleEquipmentLeanOut(item) {
        this.$refs.equipmentLeanOutApprovalModelRef.visible = true
        this.$refs.equipmentLeanOutApprovalModelRef.title = item.name
        this.$refs.equipmentLeanOutApprovalModelRef.handleDetail(item)
        this.$refs.equipmentLeanOutApprovalModelRef.disableSubmit = false
      },
      handleSecondMaintenance(item) {
        if (item && item.dataId) {
          this.selectSecondMaintenanceData = Object.assign({}, item)
          this.$refs.secondMaintenanceApprovalModal.handleDetail(item)
          this.$refs.secondMaintenanceApprovalModal.title = item.name
          this.$refs.secondMaintenanceApprovalModal.disableSubmit = false
        }
      },
      handleThirdMaintenance(item) {
        if (item && item.dataId) {
          this.selectThirdMaintenanceData = Object.assign({}, item)
          this.$refs.thirdMaintenanceApprovalModal.handleDetail(item)
          this.$refs.thirdMaintenanceApprovalModal.title = item.name
          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
        this.$refs.equipmentSealUpApprovalModelRef.handleDetail(item)
        this.$refs.equipmentSealUpApprovalModelRef.disableSubmit = false
      },
    handleEquipmentSealUp(item) {
      this.$refs.equipmentSealUpApprovalModelRef.visible = true
      this.$refs.equipmentSealUpApprovalModelRef.title = item.name
      this.$refs.equipmentSealUpApprovalModelRef.handleDetail(item)
      this.$refs.equipmentSealUpApprovalModelRef.disableSubmit = false
    }
  }
}
</script>
<style scoped>
  @import '~@assets/less/common.less';
@import '~@assets/less/common.less';
</style>
src/views/flowable/workflow/lossBound/lossBoundHandle.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,499 @@
<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.orderCode"></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"
                                           v-model="tableRowRecord.losser" dictCode="sys_user,realname,id"
                                           placeholder="请选择" />
                      </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.lossTime" :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.lossReason"></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">
                        <j-dict-select-tag :disabled="coldisabled"
                                           v-model="tableRowRecord.handler" dictCode="sys_user,realname,id"
                                           placeholder="请选择" />
                      </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 { downFile, getAction, httpAction } from '@api/manage'
export default {
  name: 'lossBoundHandle',
  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: 'center',
          dataIndex: 'toolCode'
        },
        {
          title: '工具类型',
          align: 'center',
          dataIndex: 'applicationType_dictText'
        },
        {
          title: '报损原因',
          align: 'center',
          dataIndex: 'lossReason'
        },
        {
          title: '报损数量',
          align: 'center',
          dataIndex: 'lossNumber'
        },
        {
          title: '中文名称',
          align: 'center',
          dataIndex: 'chineseName'
        },
        {
          title: '型号/图号',
          align: 'center',
          dataIndex: 'toolModel'
        },
        {
          title: '刀具材料',
          align: 'center',
          dataIndex: 'toolMaterial'
        },
        {
          title: '零件材料',
          align: 'center',
          dataIndex: 'partMaterial'
        },
        {
          title: '厂家',
          align: 'center',
          dataIndex: 'supplierId'
        },
        {
          title: '存储位置(库位号)',
          align: 'center',
          dataIndex: 'positionCode'
        },
        {
          title: '创建时间',
          align: 'center',
          dataIndex: 'createTime'
        },
        {
          title: '备注',
          align: 'center',
          dataIndex: 'remark'
        }
      ],
      validatorRules: {
        status: {
          rules: [
            { required: true, message: '请选择审批状态!' }
          ]
        }
      },
      approveData: {},
      flowData: {},
      title: '审批页面',
      width: 1200,
      visible: false,
      // è¡¨å¤´
      url: {
        queryOutBoundOrder: '/tms/toolsLossBound/queryById',
        queryOutBoundDetailList: '/tms/toolsLossBound/listlossboundDetailByMainId',
        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, { lossBoundId: 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/lossBound/LossboundDetailList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,180 @@
<template>
  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <!--    </div>-->
    <!-- æŸ¥è¯¢åŒºåŸŸ-END -->
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <div class="table-operator" v-if="mainId">
    </div>
    <!-- table区域-begin -->
    <div>
      <a-table
        ref="table"
        size="middle"
        bordered
        rowKey="id"
        :scroll="{x:true}"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection="null"
        @change="handleTableChange">
      </a-table>
    </div>
<!--    <lossboundDetail-modal ref="modalForm" @ok="modalFormOk" :mainId="mainId"></lossboundDetail-modal>-->
  </a-card>
</template>
<script>
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import LossboundDetailModal from './modules/LossboundDetailModal'
export default {
  name: 'LossboundDetailList',
  mixins: [JeecgListMixin],
  components: { LossboundDetailModal },
  props: {
    mainId: {
      type: String,
      default: '',
      required: false
    }
  },
  watch: {
    mainId: {
      immediate: true,
      handler(val) {
        if (!this.mainId) {
          this.clearList()
        } else {
          this.queryParam['lossBoundId'] = val
          this.loadData(1)
        }
      }
    }
  },
  data() {
    return {
      description: '报损管理页面',
      disableMixinCreated: true,
      // è¡¨å¤´
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          }
        },
        {
          title: '刀具编号',
          align: 'center',
          dataIndex: 'toolCode'
        },
        {
          title: '工具类型',
          align: 'center',
          dataIndex: 'applicationType_dictText'
        },
        {
          title: '报损原因',
          align: 'center',
          dataIndex: 'lossReason'
        },
        {
          title: '报损数量',
          align: 'center',
          dataIndex: 'lossNumber'
        },
        {
          title: '中文名称',
          align: 'center',
          dataIndex: 'chineseName'
        },
        {
          title: '型号/图号',
          align: 'center',
          dataIndex: 'toolModel'
        },
        {
          title: '刀具材料',
          align: 'center',
          dataIndex: 'toolMaterial'
        },
        {
          title: '零件材料',
          align: 'center',
          dataIndex: 'partMaterial'
        },
        {
          title: '厂家',
          align: 'center',
          dataIndex: 'supplierId'
        },
        {
          title: '存储位置(库位号)',
          align: 'center',
          dataIndex: 'positionCode'
        },
        {
          title: '创建时间',
          align: 'center',
          dataIndex: 'createTime'
        },
        {
          title: '备注',
          align: 'center',
          dataIndex: 'remark'
        }
        // {
        //   title: '操作',
        //   dataIndex: 'action',
        //   align:"center",
        //   fixed:"right",
        //   width:147,
        //   scopedSlots: { customRender: 'action' },
        // }
      ],
      url: {
        list: '/tms/toolsLossBound/listlossboundDetailByMainId',
        delete: '/tms/toolsLossBound/deleteLootboundDetail',
        deleteBatch: '/tms/toolsLossBound/deleteBatchLossboundDetail',
        exportXlsUrl: '/tms/toolsLossBound/exportLossboundDetail',
        importUrl: '/tms/toolsLossBound/importLossboundDetail'
      },
    }
  },
  created() {
  },
  computed: {
    importExcelUrl() {
      return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`
    }
  },
  methods: {
    clearList() {
      this.dataSource = []
      this.selectedRowKeys = []
      this.ipagination.current = 1
    }
  }
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>
src/views/tms/lossBound/LossboundList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,307 @@
<template>
  <a-card :bordered="false">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="报损单单号">
              <a-input placeholder="请输入报损单单号" v-model="queryParam.orderCode"></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="审核状态">
              <j-dict-select-tag placeholder="请选择审核状态" v-model="queryParam.orderStatus"
                                 dictCode="approval_status"/>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
              <a @click="handleToggleSearch" style="margin-left: 8px">
                {{ toggleSearchStatus ? '收起' : '展开' }}
                <a-icon :type="toggleSearchStatus ? 'up' : 'down'" />
              </a>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!-- æŸ¥è¯¢åŒºåŸŸ-END -->
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <div class="table-operator">
      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
    </div>
    <!-- table区域-begin -->
    <div>
      <a-table
        ref="table"
        size="middle"
        bordered
        rowKey="id"
        class="j-table-force-nowrap"
        :scroll="{x:true}"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}"
        :customRow="clickThenSelect"
        @change="handleTableChange">
        <span slot="action" slot-scope="text, record">
          <a @click="handleDetail(record)">详情</a>
          <span v-if="record.orderStatus === '1'">
            <a-divider type="vertical" />
            <a-popconfirm title="确定提交吗?" @confirm="() => handleSubmit(record)">
              <a>提交</a>
            </a-popconfirm>
            <a-divider type="vertical" />
            <a-dropdown>
              <a class="ant-dropdown-link">更多<a-icon type="down" /></a>
              <a-menu slot="overlay">
                <a-menu-item>
                  <a @click="handleEdit(record)">编辑</a>
                </a-menu-item>
                <a-menu-item>
                  <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
                    <a>删除</a>
                  </a-popconfirm>
                </a-menu-item>
              </a-menu>
            </a-dropdown>
          </span>
        </span>
      </a-table>
    </div>
    <a-tabs defaultActiveKey="1">
      <a-tab-pane tab="报损申请单明细" key="1">
        <LossboundDetailList ref="lossboundDetailList" :mainId="lossboundDetailMainId" />
      </a-tab-pane>
    </a-tabs>
    <lossbound-modal ref="modalForm" @ok="modalFormOk"></lossbound-modal>
  </a-card>
</template>
<script>
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import LossboundModal from './modules/LossboundModal'
import { deleteAction, getAction } from '@/api/manage'
import LossboundDetailList from './LossboundDetailList.vue'
import '@/assets/less/TableExpand.less'
export default {
  name: 'LooboundList',
  mixins: [JeecgListMixin],
  components: {
    LossboundDetailList,
    LossboundModal
  },
  data() {
    return {
      description: 'tms_outbound_order管理页面',
      // è¡¨å¤´
      columns: [
        {
          title: '报损单单号',
          align: 'center',
          dataIndex: 'orderCode'
        },
        {
          title: '审核状态',
          align: 'center',
          dataIndex: 'orderStatus_dictText'
        },
        {
          title: '经手人',
          align: 'center',
          dataIndex: 'handler_dictText'
        },
        {
          title: '审核人',
          align: 'center',
          dataIndex: 'reviewer_dictText'
        },
        {
          title: '审核时间',
          align: 'center',
          dataIndex: 'auditDate'
        },
        {
          title: '审核意见',
          align: 'center',
          dataIndex: 'approvalOpinion'
        },
        {
          title: '备注',
          align: 'center',
          dataIndex: 'remark'
        },
        {
          title: '操作',
          dataIndex: 'action',
          align: 'center',
          fixed: 'right',
          width: 147,
          scopedSlots: { customRender: 'action' }
        }
      ],
      url: {
        list: '/tms/toolsLossBound/list',
        delete: '/tms/toolsLossBound/delete',
        submit: '/tms/toolsLossBound/submit',
        deleteBatch: '/tms/toolsLossBound/deleteBatch',
        exportXlsUrl: '/tms/toolsLossBound/exportXls',
        importExcelUrl: 'tms/toolsLossBound/importExcel'
      },
      /* åˆ†é¡µå‚æ•° */
      ipagination: {
        current: 1,
        pageSize: 5,
        pageSizeOptions: ['5', '10', '50'],
        showTotal: (total, range) => {
          return range[0] + '-' + range[1] + ' å…±' + total + '条'
        },
        showQuickJumper: true,
        showSizeChanger: true,
        total: 0
      },
      selectedMainId: '',
      superFieldList: [],
      lossboundDetailMainId: ''
    }
  },
  created() {
    this.getSuperFieldList()
  },
  computed: {
    importExcelUrl: function() {
      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
    }
  },
  methods: {
    modalFormOk() {
      this.$refs.lossboundDetailList.clearList()
      this.loadData()
    },
    searchReset() {
      this.queryParam = {}
      this.onClearSelected()
      this.$refs.lossboundDetailList.clearList()
      this.loadData(1)
    },
    initDictConfig() {
    },
    clickThenSelect(record) {
      return {
        on: {
          click: () => {
            this.onSelectChange(record.id.split(','), [record])
          }
        }
      }
    },
    onClearSelected() {
      this.selectedRowKeys = []
      this.selectionRows = []
      this.selectedMainId = ''
      this.lossboundDetailMainId = ''
    },
    onSelectChange(selectedRowKeys, selectionRows) {
      this.selectedMainId = selectedRowKeys[0]
      this.selectedRowKeys = selectedRowKeys
      this.selectionRows = selectionRows
      this.lossboundDetailMainId = selectionRows[0]['id']
    },
    handleSubmit(record) {
      getAction(this.url.submit, { id: record.id }).then((res) => {
        if (res.success) {
          this.$message.success(res.message)
          this.loadData()
          this.$refs.lossboundDetailList.clearList()
        } else {
          this.$message.warning(res.message)
        }
      })
    },
    handleDelete: function(id) {
      if (!this.url.delete) {
        this.$message.error('请设置url.delete属性!')
        return
      }
      var that = this
      deleteAction(that.url.delete, { id: id }).then((res) => {
        if (res.success) {
          //重新计算分页问题
          that.reCalculatePage(1)
          // that.$message.success(res.message);
          that.$notification.success({
            message: '消息',
            description: res.message
          })
          that.loadData()
          this.$refs.lossboundDetailList.clearList()
        } else {
          // that.$message.warning(res.message);
          that.$notification.warning({
            message: '消息',
            description: res.message
          })
        }
      })
    },
    loadData(arg) {
      if (!this.url.list) {
        this.$message.error('请设置url.list属性!')
        return
      }
      //加载数据 è‹¥ä¼ å…¥å‚æ•°1则加载第一页的内容
      if (arg === 1) {
        this.ipagination.current = 1
      }
      this.onClearSelected()
      var params = this.getQueryParams()//查询条件
      this.loading = true
      getAction(this.url.list, params).then((res) => {
        if (res.success) {
          this.dataSource = res.result.records
          this.ipagination.total = res.result.total
        }
        if (res.code === 510) {
          this.$message.warning(res.message)
        }
        this.loading = false
      })
    },
    getSuperFieldList() {
      let fieldList = []
      fieldList.push({ type: 'string', value: 'orderCode', text: '出库单编号', dictCode: '' })
      fieldList.push({ type: 'string', value: 'handler', text: '经手人', dictCode: '' })
      fieldList.push({ type: 'sel_user', value: 'reviewer', text: '审核人' })
      fieldList.push({ type: 'string', value: 'orderStatus', text: '审核状态', dictCode: '' })
      fieldList.push({ type: 'date', value: 'auditDate', text: '审核时间' })
      fieldList.push({ type: 'string', value: 'approvalOpinion', text: '审核意见', dictCode: '' })
      fieldList.push({ type: 'string', value: 'subjectMatter', text: '领用事由', dictCode: '' })
      fieldList.push({ type: 'date', value: 'outboundTime', text: '出库时间' })
      fieldList.push({ type: 'string', value: 'remark', text: '备注', dictCode: '' })
      fieldList.push({ type: 'string', value: 'createBy', text: '操作员', dictCode: '' })
      fieldList.push({ type: 'date', value: 'createTime', text: '创建时间' })
      this.superFieldList = fieldList
    }
  }
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>
src/views/tms/lossBound/modules/JSelectLossboundToolModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
<template>
  <!--支持全屏缩放-->
  <j-modal
    :visible="visible"
    :width="1200"
    :title="title"
    switchFullscreen
    @ok="handleSubmit"
    @cancel="close"
    style="top: 50px"
    cancelText="关闭"
  >
    <a-card :bordered="false">
      <div class="table-page-search-wrapper">
        <a-form layout="inline" @keyup.enter.native="searchQuery">
          <a-row :gutter="24">
            <a-col :xl="6" :lg="7" :md="8" :sm="24">
              <a-form-item label="工具编码">
                <a-input placeholder="请输入工具编码,支持模糊查询" v-model="queryParam.toolCode"></a-input>
              </a-form-item>
            </a-col>
            <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
            <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
          </a-row>
        </a-form>
      </div>
      <!--出库单列表-->
      <a-table
        ref="table"
        size="middle"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :rowSelection="rowSelection"
        :loading="loading"
        @change="handleTableChange"
      >
      </a-table>
    </a-card>
  </j-modal>
</template>
<script>
import { filterObj } from '@/utils/util'
import { getAction } from '@api/manage'
export default {
  name: 'JSelectLossboundToolModal',
  components: {},
  props: {},
  data() {
    return {
      title: '选择出库工具',
      queryParam: {},
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: (_, __, index) => parseInt(index) + 1
        },
        {
          title: '工具编码',
          align: 'center',
          dataIndex: 'toolCode'
        },
        {
          title: '中文名称',
          align: 'center',
          dataIndex: 'chineseName'
        },
        {
          title: '型号/图号',
          align: 'center',
          dataIndex: 'toolModel'
        }
      ],
      selectedRowKeys: [],
      oldSelectRow: [],
      scrollTrigger: { x: 1500, y: 500 },
      dataSource: [],
      selectionRows: [],
      ipagination: {
        current: 1,
        pageSize: 10,
        pageSizeOptions: ['5', '10', '20'],
        showTotal: (total, range) => {
          return range[0] + '-' + range[1] + ' å…±' + total + '条'
        },
        showQuickJumper: true,
        showSizeChanger: true,
        total: 0,
      },
      isorter: {
        column: 'toolCode',
        order: 'asc',
      },
      departTree: [],
      visible: false,
      loading: false,
      prepareKnifeDetailList:[],
      url: {
        list: '/tms/baseTools/listWithLedgerAndConfig'
      },
    }
  },
  computed: {
    rowSelection() {
      return {
        type: 'checkbox',
        onChange: (selectedRowKeys, selectedRows) => {
          this.selectedRowKeys = selectedRowKeys
          this.onSelectChange(selectedRows)
        },
        getCheckboxProps: (record) => ({
          props: {
            disabled: record.disabled,
          },
        }),
      }
    },
  },
  watch: {
  },
  created() {
  },
  methods: {
    async loadData(arg) {
      if (arg === 1) {
        this.ipagination.current = 1
      }
      this.loading = true
      let params = this.getQueryParams() //查询条件
      console.log(params)
      await getAction(this.url.list, params).then((res) => {
        if (res.success) {
          this.dataSource = res.result.records
          this.ipagination.total = res.result.total
        }
        if (res.code === 510) {
          this.$message.warning(res.message)
        }
        this.loading = false
      })
    },
    showModal(oldSelectRow) {
      this.oldSelectRow = oldSelectRow
      this.visible = true
      this.queryParam.status = '1'
      this.queryParam.excludeIds = oldSelectRow
      this.loadData(1)
    },
    getQueryParams() {
      let param = Object.assign({}, this.queryParam, this.isorter)
      param.field = this.getQueryField()
      param.pageNo = this.ipagination.current
      param.pageSize = this.ipagination.pageSize
      return filterObj(param)
    },
    //查询条件处理
    getQueryField() {
      let fields = ['id'];
      for (let a = 0; a < this.columns.length; a++) {
        fields.push(this.columns[a].dataIndex);
      }
      return fields.join(',');
    },
    searchReset() {
      this.queryParam = {}
      this.loadData(1)
    },
    close() {
      this.queryParam = {}
      // this.searchReset(0)
      this.selectedRowKeys = []
      this.selectionRows = []
      this.visible = false
    },
    handleTableChange(pagination, filters, sorter) {
      if (Object.keys(sorter).length > 0) {
        this.isorter.column = sorter.field
        this.isorter.order = 'ascend' === sorter.order ? 'asc' : 'desc'
      }
      this.ipagination = pagination
      this.loadData()
    },
    handleSubmit() {
      if (this.selectionRows.length > 0) {
        this.$bus.$emit('selectionRows', this.selectionRows)
        // this.searchReset(0)
        this.close()
      } else {
        this.$message.warning('请至少选择一条数据')
      }
    },
    onSelectChange(selectionRows) {
      this.selectionRows = selectionRows
    },
    searchQuery() {
      this.loadData(1)
    },
  },
}
</script>
<style scoped>
.ant-table-tbody .ant-table-row td {
  padding-top: 10px;
  padding-bottom: 10px;
}
#components-layout-demo-custom-trigger .trigger {
  font-size: 18px;
  line-height: 64px;
  padding: 0 24px;
  cursor: pointer;
  transition: color 0.3s;
}
</style>
src/views/tms/lossBound/modules/LossboundDetailModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,141 @@
<template>
  <j-modal
    :title="title"
    :width="width"
    :visible="visible"
    :confirmLoading="confirmLoading"
    switchFullscreen
    @ok="handleOk"
    @cancel="handleCancel"
    cancelText="关闭">
    <a-spin :spinning="confirmLoading">
      <a-form-model ref="form" :model="model" :rules="validatorRules">
        <a-row>
          <a-col :span="24">
            <a-form-model-item label="刀具编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toolCode">
              <a-input v-model="model.toolCode" placeholder="请输入刀具编码"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="24">
            <a-form-model-item label="申请出库数量" :labelCol="labelCol" :wrapperCol="wrapperCol"
                               prop="outboundQuantity">
              <a-input-number v-model="model.outboundQuantity" placeholder="请输入申请出库数量" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="24">
            <a-form-model-item label="仓库" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="storageLocation">
              <a-input v-model="model.storageLocation" placeholder="请输入仓库"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="24">
            <a-form-model-item label="出库库位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="outboundLocation">
              <a-input v-model="model.outboundLocation" placeholder="请输入出库库位"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="24">
            <a-form-model-item label="出库状态;1.未出库;2.部分出库;3.出库完成" :labelCol="labelCol"
                               :wrapperCol="wrapperCol" prop="status">
              <a-input-number v-model="model.status" placeholder="请输入出库状态;1.未出库;2.部分出库;3.出库完成"
                              style="width: 100%" />
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </a-spin>
  </j-modal>
</template>
<script>
import { httpAction } from '@/api/manage'
export default {
  name: 'LossboundDetailModal',
  components: {},
  props: {
    mainId: {
      type: String,
      required: false,
      default: ''
    }
  },
  data() {
    return {
      title: '操作',
      width: 800,
      visible: false,
      model: {},
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      },
      confirmLoading: false,
      validatorRules: {},
      url: {
        add: '/tms/toolsLossBound/add',
        edit: '/tms/toolsLossBound/edit'
      }
    }
  },
  created() {
    //备份model原始值
    this.modelDefault = JSON.parse(JSON.stringify(this.model))
  },
  methods: {
    add() {
      this.edit(this.modelDefault)
    },
    edit(record) {
      this.model = Object.assign({}, record)
      this.visible = true
    },
    close() {
      this.$emit('close')
      this.visible = false
      this.$refs.form.clearValidate()
    },
    handleOk() {
      const that = this
      // è§¦å‘表单验证
      this.$refs.form.validate(valid => {
        if (valid) {
          that.confirmLoading = true
          let httpurl = ''
          let method = ''
          if (!this.model.id) {
            httpurl += this.url.add
            method = 'post'
          } else {
            httpurl += this.url.edit
            method = 'put'
          }
          this.model['outStorehouseId'] = this.mainId
          httpAction(httpurl, this.model, method).then((res) => {
            if (res.success) {
              that.$message.success(res.message)
              that.$emit('ok')
            } else {
              that.$message.warning(res.message)
            }
          }).finally(() => {
            that.confirmLoading = false
            that.close()
          })
        } else {
          return false
        }
      })
    },
    handleCancel() {
      this.close()
    }
  }
}
</script>
src/views/tms/lossBound/modules/LossboundModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,427 @@
<template>
  <j-modal
    :title="title"
    :width="width"
    :visible="visible"
    :confirmLoading="confirmLoading"
    switchFullscreen
    @ok="handleOk"
    @cancel="handleCancel"
    cancelText="关闭">
    <a-spin :spinning="confirmLoading">
      <a-form-model ref="form" :model="model" :rules="validatorRules">
        <a-row>
          <a-col :span="12">
            <a-form-model-item label="报损单单号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCode">
              <a-input v-model="model.orderCode" placeholder="系统自动生成" :disabled="true"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="报损人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="losser">
              <j-dict-select-tag :disabled="disableSubmit"
                                 v-model="model.losser" dictCode="sys_user,realname,id"
                                 placeholder="请选择" />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="12">
            <a-form-model-item label="报损时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lossTime">
              <j-date placeholder="请选择报损时间" date-format="YYYY-MM-DD HH:mm:ss" v-model="model.lossTime"
                      style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="审核人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="reviewer">
              <!--              <j-dict-select-tag :disabled="disableSubmit"-->
              <!--                                 v-model="model.reviewer" dictCode="sys_user,realname,id"-->
              <!--                                 placeholder="请选择" />-->
              <j-select-user-by-dep :disabled="disableSubmit" v-model="model.reviewer" :store="'username'"
                                    :text="'realname'" :multi="false" />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="12">
            <a-form-model-item v-if="addShow" label="经手人" :labelCol="labelCol" :wrapperCol="wrapperCol"
                               prop="handler">
              <j-dict-select-tag :disabled="disableSubmit"
                                 v-model="model.handler" dictCode="sys_user,realname,id"
                                 placeholder="请选择" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item v-if="addShow" label="审核状态" :labelCol="labelCol" :wrapperCol="wrapperCol"
                               prop="orderStatus">
              <j-dict-select-tag type="list" v-model="model.orderStatus" dictCode="out_bill_status"
                                 placeholder="请选择审核状态" disabled />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="12">
            <a-form-model-item v-if="addShow" label="审核时间" :labelCol="labelCol" :wrapperCol="wrapperCol"
                               prop="approvalDate">
              <j-date placeholder="请选择审核时间" date-format="YYYY-MM-DD HH:mm:ss" v-model="model.approvalDate"
                      style="width: 100%" />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="12">
            <a-form-model-item v-if="addShow" label="审核意见" :labelCol="labelCol" :wrapperCol="wrapperCol"
                               prop="approvalOpinion">
              <a-input v-model="model.approvalOpinion" placeholder="请输入审核意见" disabled></a-input>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="12">
            <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
              <a-textarea :disabled="disableSubmit" v-model="model.remark" rows="4" placeholder="请输入备注" />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="12">
            <a-form-model-item label="报损原因" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lossReason">
              <a-textarea :disabled="disableSubmit" v-model="model.lossReason" rows="4" placeholder="请输入备注" />
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </a-spin>
    <a-button type="primary" :style="{ marginBottom: '8px' }" @click="selectTools">
      é€‰æ‹©å·¥å…·
    </a-button>
    <a-table
      ref="table"
      size="middle"
      bordered
      rowKey="id"
      :scroll="{x:true}"
      :columns="columns"
      :dataSource="dataSource"
      :pagination="ipagination"
      :loading="loading"
      :rowSelection="null"
      @change="handleTableChange">
      <template v-for="col in columns" :slot="col.dataIndex" slot-scope="text, record, index">
        <a-input-number :disabled="disableSubmit" :value="text" v-if="col.dataIndex == 'lossNumber'" :min="0"
                        :max="99999"
                        @change="(e) => handleChange(e, record.key, col, index)" style="width: 100%;" />
        <a-textarea
          v-if="col.dataIndex == 'lossReason'"
          :disabled="disableSubmit"
          style="margin: -5px 0"
          :value="text"
          @change="(e) => handleChange(e.target.value, record.key, col, index)"
        />
      </template>
      <span slot="action" v-if="disableSubmit === false" slot-scope="text, record, index">
        <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record, index)">
          <a>删除</a>
        </a-popconfirm>
      </span>
    </a-table>
    <template slot="footer" v-if="disableSubmit === false">
      <a-button :style="{ marginRight: '8px' }" @click="handleCancel">关闭</a-button>
      <a-button @click="handleOk" :disabled="isDisabled" type="primary">确定</a-button>
    </template>
    <j-select-lossbound-tool-modal ref="selectLossBoundToolModal"></j-select-lossbound-tool-modal>
  </j-modal>
</template>
<script>
import { httpAction } from '@/api/manage'
import LossboundDetailList from '../LossboundDetailList.vue'
import JSelectLossboundToolModal from './JSelectLossboundToolModal.vue'
import { getAction } from '../../../../api/manage'
export default {
  name: 'LossboundModal',
  components: {
    LossboundDetailList,
    JSelectLossboundToolModal
  },
  data() {
    return {
      title: '',
      width: 1200,
      visible: false,
      disableSubmit: false,
      isDisabled: false,
      addShow: true,
      selectBorrowTool: false,
      model: {},
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      },
      //表格参数
      ipagination: {
        current: 1,
        pageSize: 10,
        total: 0
      },
      dataSource: [],
      loading: false,
      // è¡¨å¤´
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          },
          width: 50
        },
        {
          title: '刀具编号',
          dataIndex: 'toolCode',
          align: 'center',
          width: 150
        },
        {
          title: '工具类型',
          dataIndex: 'applicationType',
          align: 'center',
          width: 150
        },
        {
          title: '中文名称',
          dataIndex: 'chineseName',
          width: 150,
          align: 'center'
        },
        {
          title: '型号/图号',
          dataIndex: 'toolModel',
          width: 150,
          align: 'center'
        },
        {
          title: '刀具材料',
          width: 150,
          dataIndex: 'toolMaterial',
          align: 'center'
        },
        {
          title: '零件材料',
          width: 150,
          dataIndex: 'partMaterial',
          align: 'center'
        },
        {
          title: '厂家',
          width: 150,
          dataIndex: 'supplierId',
          align: 'center'
        },
        {
          title: '存储位置',
          width: 150,
          dataIndex: 'goodsShelvesId',
          align: 'center'
        },
        {
          title: '报损原因',
          width: 150,
          dataIndex: 'lossReason',
          align: 'center',
          scopedSlots: { customRender: 'lossReason' }
        },
        {
          title: '报损数量',
          dataIndex: 'lossNumber',
          align: 'center',
          width: 150,
          scopedSlots: { customRender: 'lossNumber' }
        },
        {
          title: '备注',
          width: 150,
          dataIndex: 'remark',
          align: 'center'
        },
        {
          title: '操作',
          width: 150,
          dataIndex: 'action',
          scopedSlots: { customRender: 'action' },
          align: 'center'
        }
      ],
      confirmLoading: false,
      validatorRules: {
        lossReason: [
          { required: true, message: '请输入报损原因' }
        ],
        lossTime: [
          { required: true, message: '请输入报损时间!' }
        ],
        losser: [
          { required: true, message: '请输入报损人!' }
        ],
      },
      url: {
        list: '/tms/toolsLossBound/listlossboundDetailByMainId',
        add: '/tms/toolsLossBound/addTotal',
        edit: '/tms/toolsLossBound/editTotal'
      }
    }
  },
  created() {
    //备份model原始值
    this.modelDefault = JSON.parse(JSON.stringify(this.model))
  },
  mounted() {
    this.$bus.$on('selectionRows', (data) => {
      for (let i = 0; i < data.length; i++) {
        this.dataSource.push({
          toolId: data[i].id,
          toolCode: data[i].toolCode,
          classifyId: data[i].classifyId,
          applicationType: data[i].applicationType_dictText,
          chineseName: data[i].chineseName,
          toolModel: data[i].toolModel,
          material: data[i].material,
          supplierId: data[i].supplierId,
          goodsShelvesId: data[i].positionCode,
          toolMaterial: data[i].toolMaterial,
          partMaterial: data[i].partMaterial
        })
      }
      this.ipagination.total = this.dataSource.length
    })
  },
  methods: {
    handleDelete(record, index) {
      this.dataSource.splice(index, 1)
    },
    handleChange(value, key, column, index) {
      console.log(value, key, column, index)
      const temp = [...this.dataSource]
      const target = temp.filter(item => key === item.key)[index]
      if (target) {
        target[column.dataIndex] = value
        this.dataSource = temp
        if (column.dataIndex === 'lossNumber') {
          target[column.dataIndex] = value
        }
        if (column.dataIndex === 'lossReason') {
          target[column.dataIndex] = value
        }
        this.dataSource = temp
      }
    },
    selectTools: function() {
      let ids = []
      for (let i = 0; i < this.dataSource.length; i++) {
        ids.push(this.dataSource[i].id)
      }
      this.$refs.selectLossBoundToolModal.showModal(ids)
      this.$refs.selectLossBoundToolModal.title = '选择工具信息'
      this.$refs.selectLossBoundToolModal.disableSubmit = false
    },
    add() {
      this.addShow = false
      this.edit()
      this.dataSource = []
    },
    edit(record) {
      console.log(record)
      this.model = Object.assign({}, record)
      this.visible = true
      getAction(this.url.list, {
        lossBoundId: record.id,
        pageNo: 1,
        pageSize: 99999
      }).then((res) => {
        if (res.success) {
          console.log(res.result.records)
          this.dataSource = res.result.records
        } else {
          this.dataSource = null
        }
      })
    },
    close() {
      this.$emit('close')
      this.addShow = true
      this.selectBorrowTool = false
      this.visible = false
      this.$refs.form.clearValidate()
    },
    handleTableChange(pagination, filters, sorter) {
      this.ipagination = pagination
    },
    handleOk() {
      const that = this
      // è§¦å‘表单验证
      this.$refs.form.validate(valid => {
        if (valid) {
          this.model.toolsLossBoundDetailList = this.dataSource
          that.confirmLoading = 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')
            } else {
              that.$message.warning(res.message)
            }
          }).finally(() => {
            that.confirmLoading = false
            that.close()
          })
        } else {
          return false
        }
      })
    },
    handleCancel() {
      this.close()
    }
  }
}
</script>
src/views/tms/requirement/ToolSharpeningList .vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,302 @@
<template>
  <a-card :bordered="false">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :xl="4" :lg="7" :md="8" :sm="24">
            <a-form-item label="刀具名称">
              <a-input placeholder="请输入刀具名称" v-model="queryParam.toolName"></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="4" :lg="7" :md="8" :sm="24">
            <a-form-item label="刃磨结果">
              <a-input placeholder="请输入刃磨结果" v-model="queryParam.grindingResult"></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="刃磨时间">
              <a-range-picker v-model="queryParam.inspectionDateRange" @change="onInspectionDateChange" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
            </a-form-item>
          </a-col>
          <a-col :xl="4" :lg="7" :md="8" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="info" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!-- æŸ¥è¯¢åŒºåŸŸ-END -->
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <div class="table-operator">
      <div class="table-operator">
        <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
      </div>
    </div>
    <!-- table区域-begin -->
    <div>
      <a-table
        ref="table"
        size="middle"
        :scroll="{x:true}"
        bordered
        rowKey="id"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection="null"
        class="j-table-force-nowrap"
        @change="handleTableChange">
        <span slot="action" slot-scope="text, record">
          <a @click="handleDetail(record)">详情</a>
          <a-divider type="vertical" />
          <a-dropdown>
            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
            <a-menu slot="overlay">
              <a-menu-item>
                <a @click="handleEdit(record)">编辑</a>
              </a-menu-item>
              <a-menu-item>
                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
                  <a>删除</a>
                </a-popconfirm>
              </a-menu-item>
            </a-menu>
          </a-dropdown>
        </span>
      </a-table>
    </div>
    <tools-sharpening-modal ref="modalForm" :treeSelected="treeSelected" @ok="modalFormOk"></tools-sharpening-modal>
  </a-card>
</template>
<script>
import '@/assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import ToolsSharpeningModal from './modules/ToolsSharpeningModal'
import { getAction, putAction, deleteAction } from '../../../api/manage'
export default {
  name: 'ToolSharpeningList ',
  mixins:[JeecgListMixin, mixinDevice],
  components: {
    ToolsSharpeningModal
  },
  data () {
    return {
      description: '刀具刃磨',
      // è¡¨å¤´
      columns: [
        {
          title: '#',
          dataIndex: '',
          key:'rowIndex',
          width:60,
          align:"center",
          customRender:function (t,r,index) {
            return parseInt(index)+1;
          }
        },
        {
          title:'刀具分类',
          align:"center",
          dataIndex: 'warehouseId'
        },
        {
          title:'刀具编号',
          align:"center",
          dataIndex: 'warehouseName'
        },
        {
          title:'刀具名称',
          align:"center",
          dataIndex: 'warehouseName'
        },
        {
          title:'刀具材料',
          align:"center",
          dataIndex: 'parentWarehouseName',
        },
        {
          title:'厂家',
          align:"center",
          dataIndex: 'status',
        },
        {
          title:'零件材料',
          align:"center",
          dataIndex: 'remark'
        },
        {
          title:'刃磨时间',
          align:"center",
          dataIndex: 'createBy'
        },
        {
          title:'刃磨结果及建议',
          align:"center",
          dataIndex: 'createBy'
        },
        {
          title:'责任人',
          align:"center",
          dataIndex: 'createBy'
        },
        {
          title:'创建人',
          align:"center",
          dataIndex: 'createBy'
        },
        {
          title:'创建时间',
          align:"center",
          dataIndex: 'createTime'
        },
        {
          title: '操作',
          dataIndex: 'action',
          align:"center",
          fixed:"right",
          width:147,
          scopedSlots: { customRender: 'action' }
        }
      ],
      url: {
        list: "/tms/toolSharpening/list",
        delete: "/tms/toolSharpening/delete",
        edit: "/tms/toolSharpening/edit",
        deleteBatch: "/tms/toolSharpening/deleteBatch",
        exportXlsUrl: "/tms/toolSharpening/exportXls",
        importExcelUrl: "tms/toolSharpening/importExcel",
      },
      dictOptions:{},
      superFieldList:[],
      treeSelected: {},
    }
  },
  created() {
    this.getSuperFieldList();
  },
  computed: {
    importExcelUrl: function(){
      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
    },
    addFlag: function(){
      return !(this.treeSelected.key && this.treeSelected.entity.leafFlag === '2');
    }
  },
  mounted() {
    this.handleGetCurrSelected = (data) => {
      this.treeSelected = data;
      this.queryParam.parentId = data.key;
      this.loadData();
    }
    this.$bus.$on('getCurrSelected', this.handleGetCurrSelected);
  },
  beforeDestroy() {
    this.$bus.$off('getCurrSelected', this.handleGetCurrSelected);
  },
  methods: {
    handleStatus(record) {
      getAction(this.url.list, { parentId: record.id }).then((res) => {
        if (res.success) {
          if (res.result.total > 0) {
            this.$message.warning('该节点下存在子节点,不能变更状态!')
          } else {
            const params = {
              id: record.id,
              status: record.status === '1' ? '2' : '1'
            }
            putAction(this.url.edit, params).then((res) => {
              if (res.success) {
                this.$message.success(res.message)
                this.loadData()
              } else {
                this.$message.warning(res.message)
              }
            })
          }
        } else {
          this.$message.warning(res.message);
        }
      });
    },
    handleDelete(id) {
      getAction(this.url.list, { parentId: id }).then((res) => {
        if (res.success) {
          if (res.result.total > 0) {
            this.$message.warning('请先删除子节点');
          } else {
            deleteAction(this.url.delete, {id: id}).then((res) => {
              if (res.success) {
                //重新计算分页问题
                this.loadData()
                this.$message.success(res.message);
                this.$bus.$emit('queryTreeData')
              } else {
                this.$message.warning(res.message);
              }
            });
          }
        } else {
          this.$message.warning(res.message);
        }
      })
    },
    searchReset() {
      this.queryParam = {
        parentId: this.treeSelected.key
      }
      this.loadData(1)
    },
    modalFormOk() {
      this.loadData()
      this.$bus.$emit('queryTreeData')
    },
    initDictConfig(){
    },
    getSuperFieldList(){
      let fieldList=[];
      fieldList.push({type:'string',value:'toolId',text:'工具编号',dictCode:''})
      fieldList.push({type:'string',value:'warehouseName',text:'仓库名称',dictCode:''})
      fieldList.push({type:'string',value:'parentId',text:'父节点编号',dictCode:''})
      fieldList.push({type:'string',value:'seq',text:'展示序号',dictCode:''})
      fieldList.push({type:'string',value:'leafFlag',text:'是否叶子节点(1是;2否)',dictCode:''})
      fieldList.push({type:'string',value:'status',text:'状态(1启用;2停用)',dictCode:''})
      fieldList.push({type:'string',value:'remark',text:'备注',dictCode:''})
      fieldList.push({type:'string',value:'createBy',text:'创建人',dictCode:''})
      fieldList.push({type:'date',value:'createTime',text:'创建时间'})
      this.superFieldList = fieldList
    }
  }
}
</script>
<style scoped>
@import '~@assets/less/common.less';
.enable {
  color: green;
}
.disable {
  color: red;
}
</style>
src/views/tms/requirement/modules/ToolsModal.vue
src/views/tms/requirement/modules/ToolsSharpeningModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,385 @@
<template>
  <j-modal
    :title="title"
    :width="1200"
    :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">
          <a-col :span="8">
            <a-form-model-item prop="standardCode" label="工具编号">
              <a-input-search v-model="model.toolsId"  placeholder="请选择工具编号"  :disabled="disableSubmit" @search="onSearchPart" enter-button
              />
            </a-form-model-item>
          </a-col>
          <a-col :span="10">
            <a-form-model-item prop="equipmentId" label="工具分类名称">
              <a-input placeholder="请输入工具分类名称" v-model="model.typeName" readOnly/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item prop="standardCode" label="工具参数标识">
              <a-input placeholder="选择设备后自动带出" readOnly v-model="model.paraTypeFlagName" readOnly/>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="工具类型">
              <a-input placeholder="选择设备后自动带出" v-model="model.applicationType" readOnly/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item prop="operator" label="责任人">
              <j-dict-select-tag type="list" v-model="model.reportPerson" dictCode="sys_user,realname,id" placeholder="请选择报工人员" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item prop="standardName" label="工具分类编码">
              <a-input placeholder="选择设备后自动带出" readOnly v-model="model.classifyId" readOnly/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item label="结果及建议" prop="inspectionDate">
              <a-input placeholder="选择填写刃磨结果及建议"  v-model="model.sharpeningResult" readOnly/>
            </a-form-model-item>
          </a-col>
          <a-col :span="6">
            <a-form-model-item label="型号/图号">
              <j-date placeholder="选择填写型号/图号" v-model="model.toolModel" disabled style="width: 100%"/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item label="仓库城市" prop="inspectionDate">
              <a-input placeholder="选择填写仓库省份城市"  v-model="model.provinceCity" readOnly/>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="库区/库号">
              <j-date placeholder="选择填写库区/库号" v-model="model.warehouseId" disabled style="width: 100%"/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item label="存储位置" prop="inspectionDate">
              <a-input placeholder="选择填写存储位置"  v-model="model.storageLocation" readOnly/>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="计量主单位">
              <j-date placeholder="请填写计量主单位" v-model="model.mainUnit" disabled style="width: 100%"/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item label="刃磨时间" prop="inspectionDate">
              <j-date placeholder="请选择打印时间" v-model="model.sharpeningTime"  style="width: 100%" />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="24">
            <a-form-model-item label="备注" :labelCol="{span:2}" :wrapperCol="{span:21}" prop="remark">
              <a-textarea v-model="model.remark" rows="3" placeholder="请输入备注"/>
            </a-form-model-item>
          </a-col>
        </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'
import MaintenanceEquipmentSelect from '@views/eam/equipment/modules/MaintenanceEquipmentSelect'
import moment from 'dayjs'
export default {
  name: 'ToolsSharpeningModal',
  mixins: [JVxeTableModelMixin],
  components: {
    MaintenanceEquipmentSelect
  },
  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: {
        // standardName: [
        //   { required: true, message: '请输入标准名称!' }
        // ],
        inspectionDate: [
          { required: true, message: '请选择点检日期!' }
        ],
        // maintenancePeriod: [
        //   { required: true, message: '请输入保养周期,单位:天!' }
        // ],
        equipmentId: [
          { required: true, message: '请选择设备!' }
        ]
      },
      url: {
        add: '/eam/eamInspectionOrder/add',
        edit: '/eam/eamInspectionOrder/edit',
        detail: '/eam/eamMaintenanceStandardDetail/queryList',
        detailOrder: '/eam/eamInspectionOrderDetail/queryList',
        userSelect: '/eam/user_select/list'
      },
      maintenanceCategory: 'POINT_INSPECTION',
      maintenanceOperatorOptions: [],
      standardId: '',
      standardType: false,
      detail: {
        loading: false,
        dataSource: [],
        columns: [
          {
            title: '序号',
            key: 'itemCode',
            type: JVXETypes.inputNumber,
            width: '10%',
            align: 'center',
            validateRules: [
              { required: true, unique: true, message: '序号不能重复' }
            ]
          },
          {
            title: '保养项',
            key: 'itemName',
            type: JVXETypes.textarea,
            width: '20%',
            align: 'center',
            validateRules: [
              { required: true, message: '保养项不能为空!' }
            ]
          },
          {
            title: '保养要求',
            key: 'itemDemand',
            type: JVXETypes.textarea,
            width: '30%',
            align: 'center',
            validateRules: [
              { required: true, message: '保养要求不能为空!' }
            ]
          }
        ]
      }
    }
  },
  created() {
  },
  methods: {
    add() {
      this.model = {}
      this.detail.dataSource = []
      this.visible = true
      this.disabled = false
      this.standardType = false
    },
    edit(record) {
      this.model = Object.assign({}, record)
      this.standardId = record.standardId
      this.disabled = true
      this.standardType = true
      this.visible = true
      this.detail.dataSource = []
      if (record && record.referenceFile) {
        let obj = JSON.parse(record.referenceFile)
        this.model.fileList = [obj]
      } else {
        this.model.fieldList = []
      }
      this.loadDetailOrder(record.id)
    },
    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.tableDetailList = [...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'
          }
          this.model.standardId = this.standardId
          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
        }
      })
    },
    onSearchPart() {
      this.$refs.PartPopUp.showModals([this.model.enterpriseId])
    },
    autocompleteForm(selectObj) {
      this.model.standardName = selectObj.standardName
      this.model.maintenancePeriod = selectObj.maintenancePeriod
      this.model.standardCode = selectObj.standardCode
      // è‹¥å–消设备选择后保养周期为空则需清空点检日期和点检过期时间
      if (!this.model.equipmentId) {
        delete this.model.inspectionDate
        delete this.model.expirationTime
      } else {
        // å¦‚果点检日期存在,则在重新选择设备后即保养周期可能发生改变后重新计算过期时间
        if (this.model.inspectionDate) this.expirationTimeFrom(this.model.inspectionDate)
      }
      if (!this.standardType) {
        console.log('this.standardType', this.standardType)
        this.standardId = selectObj.id
        this.loadDetail(selectObj.id)
      }
      this.$nextTick(() => this.loadMaintenanceOperatorList(this.model.equipmentId))
    },
    expirationTimeFrom(date) {
      //过期时间是初始时间+保养周期
      if (date && this.model.maintenancePeriod) {
        // è½¬æ¢ä¸ºæ—¶é—´æˆ³å­—符串(或指定格式)
        this.model.expirationTime = moment(date)
          .add(this.model.maintenancePeriod, 'days')
          .format('YYYY-MM-DD')
      } else {
        this.model.expirationTime = null // æ¸…空无效值
      }
    },
    //加载详情数据
    loadDetail(standardId) {
      this.detail.dataSource = []
      if (standardId) {
        console.log('standardId', standardId)
        this.spinning = true
        getAction(this.url.detail, { standardId: standardId })
          .then(res => {
            if (res.success) {
              this.detail.dataSource = [...res.result]
            }
          })
          .finally(() => {
            this.spinning = false
          })
      }
    },
    loadDetailOrder(orderId) {
      if (orderId) {
        this.spinning = true
        getAction(this.url.detailOrder, { orderId: orderId })
          .then(res => {
            if (res.success) {
              this.detail.dataSource = [...res.result]
            }
          })
          .finally(() => {
            this.spinning = false
          })
      }
    },
    loadMaintenanceOperatorList(equipmentId) {
      this.maintenanceOperatorOptions = []
      let params = { positionCode: 'PCR0001' }
      if (equipmentId) {
        params.equipmentId = equipmentId
      } else {
        delete this.model.operator
        return
      }
      const that = this
      getAction(this.url.userSelect, params)
        .then(res => {
          if (res.success) {
            that.maintenanceOperatorOptions = res.result.map(item => ({
              key: item.id,
              value: item.username,
              text: item.realname
            }))
            if (!that.maintenanceOperatorOptions.find(item => item.value === that.model.operator)) delete that.model.operator
          } else {
            if (that.model.operator) delete that.model.operator
          }
        })
        .catch(err => {
          if (that.model.operator) delete that.model.operator
        })
    },
    handleCancel() {
      this.close()
    },
    close() {
      this.$emit('close')
      this.visible = false
      this.$refs.form.clearValidate()
    }
  }
}
</script>
<style lang="less" scoped>
</style>
src/views/tms/stocktakingBound/ToolsStocktaKingBoundDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,225 @@
<template>
  <a-card :bordered="false">
    <div>
      <a-table ref="table" size="middle" bordered rowKey="id" :scroll="{ x: true }" :columns="columns"
        :dataSource="dataSource" :pagination="ipagination" :loading="loading" @change="handleTableChange">
        <span slot="num" slot-scope="text, record" class="fontweight">
          {{ record.num }}
        </span>
         </a-table>
      <template v-for="col in columns" :slot="col.dataIndex" slot-scope="text, record, index">
      </template>
    </div>
  </a-card>
</template>
<script>
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import { getAction } from '@/api/manage'
import Tooltip from 'ant-design-vue/es/tooltip'
export default {
  name: "ToolsStocktaKingBoundDetail",
  components: {
    Tooltip,
  },
  mixins: [JeecgListMixin],
  props: {
    mainId: {
      type: String,
      default: '',
      required: false
    }
  },
  watch: {
    mainId: {
      immediate: true,
      handler(val) {
        if (!this.mainId) {
          this.clearList()
        } else {
          alert(val)
          this.queryParam['stocktakingBoundId'] = val;
          this.queryParam['delFlag'] = 0;
          this.loadData(1);
        }
      }
    }
  },
  data() {
    return {
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          },
          width: 50
        },
        {
          title: '刀具编号',
          dataIndex: 'toolCode',
          align: 'center'
        },
        {
          title: '工具类型',
          dataIndex: 'applicationType_dictText',
          align: 'center',
        },
        {
          title: '中文名称',
          dataIndex: 'chineseName',
          align: 'center'
        },
        {
          title: '型号/图号',
          dataIndex: 'toolModel',
          align: 'center'
        },
        {
          title: '刀具材料',
          dataIndex: 'toolMaterial',
          align: 'center'
        },
        {
          title: '零件材料',
          dataIndex: 'partMaterial',
          align: 'center'
        },
        {
          title: '厂家',
          dataIndex: 'supplierId',
          align: 'center'
        },
        {
          title: '存储位置(库位号)',
          dataIndex: 'goodsShelvesId',
          align: 'center'
        },
        {
          title: '账面数量',
          dataIndex: 'bookQuantity',
          align: 'center'
        },
        {
          title: '可用数量',
          dataIndex: 'availableQuantity',
          align: 'center'
        },
        {
          title: '实盘数量',
          dataIndex: 'practicalQuantity',
          align: 'center'
        },
        {
          title: '差异值',
          dataIndex: 'differenceValue',
          align: 'center'
        },
        {
          title: '盘亏盘盈',
          dataIndex: 'surplusDeficit_dictText',
          align: 'center'
        },
        {
          title: '盘库时间',
          dataIndex: 'stocktakingDate',
          align: 'center'
        },
        {
          title: '备注',
          dataIndex: 'remark',
          align: 'center'
        }
      ],
      url: {
        list: "/tms/toolsStocktakingBound/listToolsStocktakingBoundControllerDetailsByMainId",
      },
      /* åˆ†é¡µå‚æ•° */
      ipagination: {
        current: 1,
        pageSize: 20,
        pageSizeOptions: ['5', '10', '20', '50'],
        showTotal: (total, range) => {
          return range[0] + '-' + range[1] + ' å…±' + total + '条'
        },
        showQuickJumper: true,
        showSizeChanger: true,
        total: 0
      },
    }
  },
  created() {
  },
  computed: {
  },
  methods: {
    clearList() {
      this.dataSource = []
      this.selectedRowKeys = []
      this.ipagination.current = 1
    },
    loadData(arg) {
      if (!this.url.list) {
        this.$message.error("请设置url.list属性!")
        return
      }
      //加载数据 è‹¥ä¼ å…¥å‚æ•°1则加载第一页的内容
      if (arg === 1) {
        this.ipagination.current = 1;
      }
      var params = this.getQueryParams();//查询条件
      this.loading = true;
      getAction(this.url.list, params).then((res) => {
        if (res.success) {
          this.dataSource = res.result.records || res.result;
          if (res.result.total) {
            this.ipagination.total = res.result.total;
          } else {
            this.ipagination.total = 0;
          }
          //update-end---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
        } else {
          this.$message.warning(res.message)
        }
      }).finally(() => {
        this.loading = false
      })
    },
  }
}
</script>
<style lang="less" scoped>
@import '~@assets/less/common.less';
.fontweight {
  font-weight: bold;
}
/deep/ .frozenRowClass {
  color: #c9c9c9;
}
.success {
  color: green;
}
.error {
  color: red;
}
</style>
src/views/tms/stocktakingBound/ToolsStocktakingBoundList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,321 @@
<template>
  <a-card :bordered="false">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="盘点单号">
              <a-input placeholder="请输入盘点单号" v-model="queryParam.orderCode"></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="经手人">
              <j-dict-select-tag dictCode="sys_user,realname,id" placeholder="请选择经手人" v-model="queryParam.handler"
                                  />
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
              <a @click="handleToggleSearch" style="margin-left: 8px">
                {{ toggleSearchStatus ? '收起' : '展开' }}
                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
              </a>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!-- æŸ¥è¯¢åŒºåŸŸ-END -->
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <div class="table-operator">
      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
<!--      <a-dropdown v-if="selectedRowKeys.length > 0">-->
<!--        <a-menu slot="overlay">-->
<!--          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>-->
<!--        </a-menu>-->
<!--        <a-button style="margin-left: 8px"> æ‰¹é‡æ“ä½œ <a-icon type="down" /></a-button>-->
<!--      </a-dropdown>-->
    </div>
    <!-- table区域-begin -->
    <div>
      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
        <i class="anticon anticon-info-circle ant-alert-icon"></i> å·²é€‰æ‹© <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
      </div>
      <a-table
        ref="table"
        size="middle"
        bordered
        rowKey="id"
        class="j-table-force-nowrap"
        :scroll="{x:true}"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection='{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }' :customRow='clickThenSelect'
        @change="handleTabChange">
        <span slot="action" slot-scope="text, record">
          <a @click="handleDetail(record)">详情</a>
          <span v-if="record.approvalStatus === '1'">
            <a-divider type="vertical" />
            <a-popconfirm title="确定提交吗?" @confirm="() => handleSubmit(record)">
              <a>提交</a>
            </a-popconfirm>
            <a-divider type="vertical" />
            <a-dropdown>
              <a class="ant-dropdown-link">更多<a-icon type="down" /></a>
              <a-menu slot="overlay">
                <a-menu-item>
                  <a @click="handleEdit(record)">编辑</a>
                </a-menu-item>
                <a-menu-item>
                  <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
                    <a>删除</a>
                  </a-popconfirm>
                </a-menu-item>
              </a-menu>
            </a-dropdown>
          </span>
        </span>
      </a-table>
      <a-tabs defaultActiveKey="1">
        <!-- type="card" -->
        <a-tab-pane tab='盘点单明细' key="1">
          <div class="table-operator" style="margin:-16px">
            <tools-stockta-king-bound-detail ref="toolStockingBoundDetail"  :mainId='mainId' />
          </div>
        </a-tab-pane>
      </a-tabs>
    </div>
    <tools-stocktaking-bound-modal
      ref="modalForm"
      @ok="modalFormOk"
    ></tools-stocktaking-bound-modal>
  </a-card>
</template>
<script>
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import ToolsStocktaKingBoundDetail from './ToolsStocktaKingBoundDetail.vue'
import ToolsStocktakingBoundModal from './modules/ToolsStocktakingBoundModal'
import '@/assets/less/TableExpand.less'
import { deleteAction, getAction } from '@api/manage'
export default {
    name: "ToolsStocktakingBoundList",
    mixins:[JeecgListMixin],
    components: {
      ToolsStocktakingBoundModal,
      ToolsStocktaKingBoundDetail
    },
    data () {
      return {
        description: '盘点单表管理页面',
        // è¡¨å¤´
        columns: [
          {
            title: '#',
            dataIndex: '',
            key:'rowIndex',
            width:60,
            align:"center",
            customRender:function (t,r,index) {
              return parseInt(index)+1;
            }
          },
          {
            title:'盘点单号',
            align:"center",
            dataIndex: 'orderCode'
          },
          {
            title:'经手人',
            align:"center",
            dataIndex: 'handler_dictText'
          },
          {
            title:'审核人',
            align:"center",
            dataIndex: 'reviewer_dictText'
          },
          {
            title:'盘点名称',
            align:"center",
            dataIndex: 'stocktakingName'
          },
          {
            title:'备注',
            align:"center",
            dataIndex: 'remark'
          },
          {
            title:'审核状态',
            align:"center",
            dataIndex: 'approvalStatus_dictText'
          },
          {
            title:'审核意见',
            align:"center",
            dataIndex: 'approvalOpinion'
          },
          {
            title:'盘点时间',
            align:"center",
            dataIndex: 'inventoryTime'
          },
          {
            title: '操作',
            dataIndex: 'action',
            align:"center",
            fixed:"right",
            width:147,
            scopedSlots: { customRender: 'action' },
          }
        ],
        url: {
          list: "/tms/toolsStocktakingBound/list",
          submit:"/tms/toolsStocktakingBound/submit",
          delete: "/tms/toolsStocktakingBound/delete",
          deleteBatch: "/tms/toolsStocktakingBound/deleteBatch",
          exportXlsUrl: "/tms/toolsStocktakingBound/exportXls",
          importExcelUrl: "tms/toolsStocktakingBound/importExcel",
        },
        dictOptions:{},
        mainId: '',
        superFieldList:[],
        selectedMainId: '',
      }
    },
    created() {
    },
    computed: {
      importExcelUrl: function(){
        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
      }
    },
    methods: {
      clickThenSelect(record) {
        return {
          on: {
            click: () => {
              this.onSelectChange(record.id.split(','), [record])
            }
          }
        }
      },
      onClearSelected() {
        this.selectedRowKeys = []
        this.selectionRows = []
        this.selectedMainId = ''
      },
      onSelectChange(selectedRowKeys, selectionRows) {
        if (selectedRowKeys.length == 1) {
          this.mainId = selectionRows[0]['id']
        } else {
          this.mainId = ''
        }
        this.selectedRowKeys = selectedRowKeys
        this.selectionRows = selectionRows
      },
      handleTabChange(pagination, filters, sorter) {
        this.selectedRowKeys = []
        this.$refs.toolStockingBoundDetail.dataSource = []
        this.handleTableChange(pagination, filters, sorter)
      },
      handleDelete: function (id) {
        if (!this.url.delete) {
          this.$message.error('请设置url.delete属性!')
          return
        }
        deleteAction(this.url.delete, { id: id }).then((res) => {
          if (res.success) {
            //重新计算分页问题
            this.reCalculatePage(1)
            this.$message.success(res.message)
            this.$refs.toolStockingBoundDetail.dataSource = []
            this.loadData()
          } else {
            this.$message.warning(res.message)
          }
        })
      },
      handleSubmit(record) {
        getAction(this.url.submit,{ id: record.id }).then((res)=>{
          if (res.success) {
            this.$message.success(res.message);
            this.loadData();
            this.$refs.toolStockingBoundDetail.clearList()
          } else {
            this.$message.warning(res.message);
          }
        })
      },
      searchQuery() {
        this.selectedRowKeys = [];
        this.$refs.toolStockingBoundDetail.loadData();
        this.$refs.toolStockingBoundDetail.selectedRowKeys = [];
        this.loadData();
      },
      searchReset() {
        this.queryParam = {}
        this.selectedRowKeys = []
        this.$refs.toolStockingBoundDetail.dataSource = []
        this.loadData();
      },
      modalFormOk() {
        this.queryParam = {}
        this.selectedRowKeys = []
        this.$refs.toolStockingBoundDetail.dataSource = []
        this.loadData();
      },
      handleEdit: function (record) {
        console.log('record:', record)
        this.$refs.modalForm.title = '编辑'
        this.$refs.modalForm.disableSubmit = false
        this.$refs.modalForm.edit(record)
      },
      handleDetail:function(record){
        this.$refs.modalForm.title="详情";
        this.$refs.modalForm.disableSubmit = true;
        this.$refs.modalForm.edit(record);
      },
      handleAdd: function () {
        this.$refs.modalForm.disableSubmit = false
        this.$refs.modalForm.title = "新增工具申请单";
        this.$refs.modalForm.add();
        console.log(this.$refs.modalForm.title);
      },
      initDictConfig(){
      },
    }
  }
</script>
<style scoped>
  @import '~@assets/less/common.less';
</style>
src/views/tms/stocktakingBound/modules/ToolSelectorModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,216 @@
<template>
  <!--支持全屏缩放-->
  <a-modal :visible='visible' :title='title' switchFullscreen @ok='handleSubmit' @cancel='close' style='top:50px'
           cancelText='关闭' :width='1500'>
    <a-card :bordered='false'>
      <div class='table-page-search-wrapper'>
        <a-form layout='inline' @keyup.enter.native='searchQuery'>
          <a-row :gutter='24'>
            <a-col :md='8' :sm='6'>
              <a-form-item label='工具编码'>
                <j-input placeholder='请输入工具编码' v-model='queryParam.toolCode' />
              </a-form-item>
            </a-col>
            <a-col :md='3'>
              <span style='float: left;overflow: hidden;' class='table-page-search-submitButtons'>
                <a-button type='primary' @click='searchQuery' icon='search'>查询</a-button>
                <a-button @click='searchReset' icon='reload' style='margin-left: 10px'>重置</a-button>
              </span>
            </a-col>
          </a-row>
        </a-form>
      </div>
      <a-table ref='table' :scroll='scrollTrigger' size='middle' rowKey='id' bordered :columns='columns'
               :dataSource='dataSource' :pagination='ipagination' :rowSelection='rowSelection' :loading='loading'
               @change='handleTableChange'>
      </a-table>
    </a-card>
  </a-modal>
</template>
<script>
import { filterObj } from '@/utils/util'
import { getAction } from '@/api/manage'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
export default {
  name: 'ToolSelectorModal',
  mixins: [JeecgListMixin],
  components: {},
  props: {},
  data() {
    return {
      queryParam: {},
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: (_, __, index) => parseInt(index) + 1
        },
        {
          title: '工具编码',
          align: 'center',
          dataIndex: 'toolCode'
        },
        {
          title: '中文名称',
          align: 'center',
          dataIndex: 'chineseName'
        },
        {
          title: '型号/图号',
          align: 'center',
          dataIndex: 'toolModel'
        }
      ],
      selectedRowKeys: [],
      oldSelectRows: [],
      scrollTrigger: {},
      dataSource: [],
      selectionRows: [],
      title: '根据查询结果选择工具',
      ipagination: {
        current: 1,
        pageSize: 10,
        pageSizeOptions: ['5', '10', '30', '50', '100'],
        showTotal: (total, range) => {
          return range[0] + '-' + range[1] + ' å…±' + total + '条'
        },
        showQuickJumper: true,
        showSizeChanger: true,
        total: 0
      },
      isorter: {
        column: 'createTime',
        order: 'desc'
      },
      visible: false,
      loading: false,
      url: {
        list: '/tms/baseTools/listWithLedgerAndConfig'
      }
    }
  },
  computed: {
    rowSelection() {
      return {
        type: 'checkbox',
        onChange: (selectedRowKeys, selectedRows) => {
          this.selectedRowKeys = selectedRowKeys
          this.onSelectChange(selectedRows)
        },
        getCheckboxProps: record => ({
          props: {
            disabled: record.distable
          }
        }),
        selectedRowKeys: this.selectedRowKeys
      }
    }
  },
  methods: {
    async loadData(arg) {
      if (arg === 1) {
        this.ipagination.current = 1
      }
      let that = this
      this.loading = true
      let params = this.getQueryParams()//查询条件
      await getAction(this.url.list, params).then((res) => {
        if (res.success) {
          for (let i = 0; i < res.result.records.length; i++) {
            if (that.oldSelectRows.indexOf(res.result.records[i].id) > -1) {
              res.result.records[i].distable = true
            } else {
              res.result.records[i].distable = false
            }
          }
          this.dataSource = res.result.records
          this.ipagination.total = res.result.total
        }
        if (res.code === 510) {
          this.$message.warning(res.message)
        }
        this.loading = false
      })
    },
    showModals(oldSelectRows) {
      this.selectionRows = []
      this.oldSelectRows = oldSelectRows
      this.visible = true
      this.loadData(1)
    },
    getQueryParams() {
      let param = Object.assign({}, this.queryParam, this.isorter)
      param.field = this.getQueryField()
      param.pageNo = this.ipagination.current
      param.pageSize = this.ipagination.pageSize
      return filterObj(param)
    },
    //查询条件处理
    getQueryField() {
      let str = 'id,'
      for (let a = 0; a < this.columns.length; a++) {
        str += ',' + this.columns[a].dataIndex
      }
      return str
    },
    searchReset(num) {
      let that = this
      this.queryParam = []
      if (num !== 0) {
        that.loadData(1)
      }
      that.selectborrowIds = []
    },
    close() {
      this.searchReset(0)
      this.selectedRowKeys = []
      this.visible = false
    },
    handleTableChange(pagination, filters, sorter) {
      //TODO ç­›é€‰
      if (Object.keys(sorter).length > 0) {
        this.isorter.column = sorter.field
        this.isorter.order = 'ascend' === sorter.order ? 'asc' : 'desc'
      }
      this.ipagination = pagination
      this.loadData()
    },
    handleSubmit() {
      this.$bus.$emit('selectionRows', this.selectionRows)
      // this.searchReset(0)
      this.close()
    },
    onSelectChange(selectionRows) {
      this.selectionRows = selectionRows
    },
    searchQuery() {
      this.loadData(1)
    }
  }
}
</script>
<style scoped>
.ant-table-tbody .ant-table-row td {
  padding-top: 10px;
  padding-bottom: 10px;
}
#components-layout-demo-custom-trigger .trigger {
  font-size: 18px;
  line-height: 64px;
  padding: 0 24px;
  cursor: pointer;
  transition: color 0.3s;
}
</style>
src/views/tms/stocktakingBound/modules/ToolsStocktakingBoundModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,504 @@
<template>
  <a-modal :title="title" :width="1500" :height="1500" :visible="visible" :maskClosable="false" @ok="handleOk"
           cancelText="关闭"
           @cancel="handleCancel" :confirmLoading="confirmLoading">
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <a-row>
          <a-col :span="12">
            <a-form-model-item label="盘点单号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCode">
              <a-input :disabled="true" v-model="model.orderCode" placeholder="系统自动生成"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="盘点类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="approvalStatus">
              <j-dict-select-tag dictCode="stocktakingType" placeholder="请选择盘点类型" v-model="model.stocktakingType"
                                 :disabled="disableSubmit"></j-dict-select-tag>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item v-show="addShow" label="经手人" :labelCol="labelCol" :wrapperCol="wrapperCol"
                               prop="handler">
              <j-dict-select-tag dictCode="sys_user,realname,id" placeholder="请选择经手人" v-model="model.handler"
                                 :disabled="disableSubmit" />
            </a-form-model-item>
          </a-col>
          <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="'username'"
                                    :text="'realname'" :multi="false" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="盘点名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="stocktakingName">
              <a-input v-model="model.stocktakingName" placeholder="请输入盘点名称"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item v-show="addShow" label="审核状态" :labelCol="labelCol" :wrapperCol="wrapperCol"
                               prop="approvalStatus">
              <j-dict-select-tag dictCode="approval_status" placeholder="请选择审核状态" v-model="model.approvalStatus"
                                 :disabled="true"></j-dict-select-tag>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item v-show="addShow" label="审核意见" :labelCol="labelCol" :wrapperCol="wrapperCol"
                               prop="approvalOpinion">
              <a-input v-model="model.approvalOpinion" placeholder="请输入审核意见" type="textarea"
                       :disabled="model.approvalStatus==1"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="盘点时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="inventoryTime">
              <j-date placeholder="请选择盘点时间" date-format="YYYY-MM-DD HH:mm:ss" v-model="model.inventoryTime"
                      style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
              <a-input v-model="model.remark" placeholder="请输入备注" type="textarea"></a-input>
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form>
    </a-spin>
    <a-button type="primary" :style="{ marginRight: '8px', marginBottom: '8px' }" :loading="confirmLoading"
              :disabled="disableSubmit" @click="selectTools()">工具明细
    </a-button>
    <a-table ref="table" bordered size="middle" rowKey="id" :columns="columns" :dataSource="dataSource"
             :scroll="{x:true}">
      <template v-for="col in columns" :slot="col.dataIndex" slot-scope="text, record, index">
        <a-input-number :disabled="disableSubmit" :value="text" v-if="col.dataIndex == 'practicalQuantity'" :min="0"
                        :max="99999"
                        @change="(e) => handleChange(e, record.key, col, index)" style="width: 100%;" />
        <a-input-number :value="text" v-if="col.dataIndex == 'differenceValue'" :min="0" :max="99999"
                        :disabled="true" @change="(e) => handleChange(e, record.key, col, index)"
                        style="width: 100%;" />
        <j-dict-select-tag :value="text" v-if="col.dataIndex == 'surplusDeficit'"
                           dictCode="surplusDeficit"
                           :disabled="true"
                           style="width: 100%;"
                           @change="(e) => handleChange(e, record.key, col, index)" />
        <!--        <j-dict-select-tag :value="text" v-if="col.dataIndex == 'classifyId'"-->
        <!--                           dictCode="tms_tools_classify,type_name,id"-->
        <!--                           style="width: 100%;"-->
        <!--                           :disabled="true"-->
        <!--                           @change="(e) => handleChange(e, record.key, col, index)" />-->
        <j-date
          :value="text"
          v-if="col.dataIndex == 'stocktakingDate'"
          placeholder="选择盘库时间"
          @change="(e) => handleChange(e, record.key, col, index)"
          style="width: 100%;"
        />
        <a-textarea
          v-if="col.dataIndex == 'remark'"
          :disabled="disableSubmit"
          style="margin: -5px 0"
          :value="text"
          @change="(e) => handleChange(e.target.value, record.key, col, index)"
        />
      </template>
      <span slot="action" slot-scope="text, record, index">
        <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(text, record, index)">
          <a :disabled="disableSubmit">删除</a>
        </a-popconfirm>
      </span>
    </a-table>
    <template slot="footer">
      <a-button :style="{ marginRight: '8px' }" @click="handleCancel()">
        å…³é—­
      </a-button>
      <a-button @click="handleOk()" :disabled="disableSubmit" type="primary" :loading="confirmLoading">确定</a-button>
    </template>
    <tool-selector-modal ref="toolsModalForm"></tool-selector-modal>
  </a-modal>
</template>
<script>
import { getAction, postAction, requestPut } from '@/api/manage'
import JMultiSelectTag from '@/components/dict/JMultiSelectTag'
import Tooltip from 'ant-design-vue/es/tooltip'
import ToolSelectorModal from '@views/tms/stocktakingBound/modules/ToolSelectorModal.vue'
export default {
  name: 'ToolsStocktakingBoundModal',
  components: {
    ToolSelectorModal,
    JMultiSelectTag,
    Tooltip
  },
  data() {
    return {
      addShow: true,
      model: {},
      formDisabled: false,
      pagination: {
        current: 1,
        pageSize: 10,
        total: 0
      },
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          },
          width: 50
        },
        {
          title: '刀具编号',
          dataIndex: 'toolCode',
          align: 'center',
          width: 150
        },
        {
          title: '工具类型',
          dataIndex: 'applicationType',
          align: 'center',
          width: 150
        },
        {
          title: '中文名称',
          dataIndex: 'chineseName',
          width: 150,
          align: 'center'
        },
        {
          title: '型号/图号',
          dataIndex: 'toolModel',
          width: 150,
          align: 'center'
        },
        {
          title: '刀具材料',
          width: 150,
          dataIndex: 'toolMaterial',
          align: 'center'
        },
        {
          title: '零件材料',
          width: 150,
          dataIndex: 'partMaterial',
          align: 'center'
        },
        {
          title: '厂家',
          width: 150,
          dataIndex: 'supplierId',
          align: 'center'
        },
        {
          title: '存储位置',
          width: 150,
          dataIndex: 'goodsShelvesId',
          align: 'center'
        },
        {
          title: '账面库存',
          width: 150,
          dataIndex: 'bookQuantity',
          align: 'center'
        },
        {
          title: '可用数量',
          width: 150,
          dataIndex: 'availableQuantity',
          align: 'center'
        },
        {
          title: '实盘数量',
          dataIndex: 'practicalQuantity',
          align: 'center',
          width: 150,
          scopedSlots: { customRender: 'practicalQuantity' }
        },
        {
          title: '差异值',
          dataIndex: 'differenceValue',
          align: 'center',
          width: 150,
          scopedSlots: { customRender: 'differenceValue' }
        },
        {
          title: '盘亏盘盈',
          width: 150,
          dataIndex: 'surplusDeficit',
          align: 'center',
          scopedSlots: { customRender: 'surplusDeficit' }
        },
        {
          title: '盘库时间',
          width: 150,
          dataIndex: 'stocktakingDate',
          align: 'center',
          scopedSlots: { customRender: 'stocktakingDate' }
        },
        {
          title: '备注',
          width: 150,
          dataIndex: 'remark',
          align: 'center',
          scopedSlots: { customRender: 'remark' }
        },
        {
          title: '操作',
          width: 150,
          dataIndex: 'action',
          scopedSlots: { customRender: 'action' },
          align: 'center'
        }
      ],
      title: '操作',
      visible: false,
      disableSubmit: false,
      codeDisable: true,
      labelCol: {
        xs: { span: 24 },
        sm: { span: 6 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 18 }
      },
      confirmLoading: false,
      form: this.$form.createForm(this),
      validatorRules: {
        orderCode: [
          { required: true, message: '请输入盘点单号!' }
        ],
        handler: [
          { required: true, message: '请输入经手人!' }
        ],
        stocktakingName: [
          { required: true, message: '请输入盘点名称!' }
        ],
        approvalStatus: [
          { required: true, message: '请输入审核状态!' }
        ],
        inventoryTime: [
          { required: true, message: '请输入盘点时间!' }
        ]
      },
      url: {
        add: '/tms/toolsStocktakingBound/add',
        edit: '/tms/toolsStocktakingBound/edit',
        queryDetailList: '/tms/toolsStocktakingBound/listToolsStocktakingBoundControllerDetailsByMainId'
      },
      dataSource: []
    }
  },
  mounted() {
    this.$bus.$on('selectionRows', (data) => {
      for (let i = 0; i < data.length; i++) {
        this.dataSource.push({
          toolId: data[i].id,
          toolCode: data[i].toolCode,
          classifyId: data[i].classifyId,
          applicationType: data[i].applicationType_dictText,
          chineseName: data[i].chineseName,
          toolModel: data[i].toolModel,
          material: data[i].material,
          toolMaterial: data[i].toolMaterial,
          partMaterial: data[i].partMaterial,
          bookQuantity: data[i].totalCount,
          supplierId: data[i].supplierId,
          goodsShelvesId: data[i].positionCode
        })
      }
    })
  },
  methods: {
    selectTools: function() {
      let ids = []
      for (let i = 0; i < this.dataSource.length; i++) {
        ids.push(this.dataSource[i].partId)
      }
      this.$refs.toolsModalForm.showModals(ids)
      this.$refs.toolsModalForm.title = '选择工具信息'
      this.$refs.toolsModalForm.disableSubmit = false
    },
    add() {
      this.addShow = false
      this.edit()
    },
    edit(record) {
      console.log(record)
      console.log(this.auditFlag)
      this.form.resetFields()
      this.model = Object.assign({}, record)
      this.visible = true
      getAction(this.url.queryDetailList, {
        stocktakingBoundId: record.id,
        pageNo: 1,
        pageSize: 99999
      }).then((res) => {
        if (res.success) {
          console.log(res.result.records)
          this.dataSource = res.result.records
        } else {
          this.dataSource = null
        }
      })
    },
    close() {
      this.$emit('close')
      this.visible = false
    },
    handleCancel() {
      this.model = {}
      this.dataSource = []
      this.close()
    },
    handleOk() {
      const that = this
      let data = that.dataSource
      for (let i = 0; i < data.length; i++) {
        if (data[i].practicalQuantity == undefined || data[i].practicalQuantity == null || data[i].practicalQuantity == '') {
          that.$message.warning('请输入第' + (i + 1) + '行的实盘数量数据!')
          return false
        }
      }
      this.form.validateFields((err, values) => {
        if (!err) {
          that.confirmLoading = true
          let formData = Object.assign(this.model, values)
          if (that.dataSource.length === 0) {
            that.$message.warning('请选择工具!')
            that.confirmLoading = false
            return
          }
          formData.toolsStocktakingBoundDetailList = that.dataSource
          // formData.status = '0';
          let obj
          if (!this.model.id) {
            obj = postAction(this.url.add, formData)
          } else {
            obj = requestPut(this.url.edit, formData, { id: this.model.id })
          }
          obj.then((res) => {
            if (res.success) {
              that.$message.success(res.message)
              that.$emit('ok')
              that.close()
            } else {
              that.$message.warning(res.message)
            }
          }).finally(() => {
            that.confirmLoading = false
          })
        }
      })
    },
    handleDelete(text, record, index) {
      this.dataSource.splice(index, 1)
    },
    handleChange(value, key, column, index) {
      let that = this
      const temp = [...that.dataSource]
      const target = temp.filter(item => key === item.key)[index]
      if (target) {
        // if (column.dataIndex == 'practicalQuantity') {
        //   target[column.dataIndex] = value
        // }
        if (column.dataIndex === 'practicalQuantity') {
          target[column.dataIndex] = value
          // è®¡ç®—差异值
          target.differenceValue = value - target.availableQuantity
          // æ ¹æ®å·®å¼‚值判断盘亏盘盈
          if (target.differenceValue > 0) {
            target.surplusDeficit = 1
          } else if (target.differenceValue < 0) {
            target.surplusDeficit = 2
          } else {
            target.surplusDeficit = 0
          }
        }
        if (column.dataIndex == 'differenceValue') {
          target[column.dataIndex] = value
        }
        if (column.dataIndex == 'classifyId') {
          target[column.dataIndex] = value
        }
        if (column.dataIndex == 'surplusDeficit') {
          target[column.dataIndex] = value  // å‡è®¾ value æ˜¯å­—符串格式的日期
        }
        if (column.dataIndex == 'stocktakingDate') {
          target[column.dataIndex] = value  // å‡è®¾ value æ˜¯å­—符串格式的日期
        }
        if (column.dataIndex === 'remark') {
          // æ³¨æ„è¿™é‡Œä½¿ç”¨çš„æ˜¯ e.target.value
          target[column.dataIndex] = value
        }
        that.dataSource = temp
      }
    }
  }
}
</script>
<style lang="less" scoped>
.frozenRowClass {
  color: #c9c9c9;
}
.fontweight {
  font-weight: bold;
}
.ant-btn {
  padding: 0 10px;
  margin-left: 3px;
}
.ant-form-item-control {
  line-height: 0px;
}
/** ä¸»è¡¨å•行间距 */
.ant-form .ant-form-item {
  margin-bottom: 10px;
}
/** Tab页面行间距 */
.ant-tabs-content .ant-form-item {
  margin-bottom: 0px;
}
</style>
src/views/tms/storeEarlyWarning/ToolsStoreEarlyWarningList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,303 @@
<template>
  <a-card :bordered="false">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col
            :md="6"
            :sm="8"
          >
            <a-form-item
              label="工具编号"
              :labelCol="{span: 5}"
              :wrapperCol="{span: 18, offset: 1}"
            >
              <a-input
                placeholder="请输入工具编码检索"
                v-model="queryParam.toolCode"
              ></a-input>
            </a-form-item>
          </a-col>
          <a-col
            :md="6"
            :sm="8"
          >
            <a-form-item
              label="厂家"
              :labelCol="{span: 5}"
              :wrapperCol="{span: 18, offset: 1}"
            >
              <a-input
                placeholder="请输入厂家检索"
                v-model="queryParam.supplierId"
              ></a-input>
            </a-form-item>
          </a-col>
          <a-col
            :md="6"
            :sm="8"
          >
            <a-form-item
              label="材质"
              :labelCol="{span: 5}"
              :wrapperCol="{span: 18, offset: 1}"
            >
              <a-input
                placeholder="请输入材质检索"
                v-model="queryParam.toolMaterial"
              ></a-input>
            </a-form-item>
          </a-col>
          <a-col
            :md="6"
            :sm="8"
          >
            <a-form-item
              label="刀具规格"
              :labelCol="{span: 5}"
              :wrapperCol="{span: 18, offset: 1}"
            >
              <a-input
                placeholder="请输入刀具规格检索"
                v-model="queryParam.toolModel"
              ></a-input>
            </a-form-item>
          </a-col>
          <a-col :md="6" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!-- æŸ¥è¯¢åŒºåŸŸ-END -->
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <div class="table-operator">
<!--      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>-->
<!--      <a-button type="primary" icon="download" @click="handleExportXls('tms_store_early warning')">导出</a-button>-->
<!--      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">-->
<!--        <a-button type="primary" icon="import">导入</a-button>-->
<!--      </a-upload>-->
      <a-dropdown v-if="selectedRowKeys.length > 0">
        <a-menu slot="overlay">
          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
        </a-menu>
        <a-button style="margin-left: 8px"> æ‰¹é‡æ“ä½œ <a-icon type="down" /></a-button>
      </a-dropdown>
    </div>
    <!-- table区域-begin -->
    <div>
      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
        <i class="anticon anticon-info-circle ant-alert-icon"></i> å·²é€‰æ‹© <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
      </div>
      <a-table
        ref="table"
        size="middle"
        :scroll="{x:true}"
        bordered
        rowKey="id"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
        class="j-table-force-nowrap"
        @change="handleTableChange">
        <template slot="htmlSlot" slot-scope="text">
          <div v-html="text"></div>
        </template>
        <template slot="imgSlot" slot-scope="text,record">
          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
        </template>
        <template slot="fileSlot" slot-scope="text">
          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
          <a-button
            v-else
            :ghost="true"
            type="primary"
            icon="download"
            size="small"
            @click="downloadFile(text)">
            ä¸‹è½½
          </a-button>
        </template>
        <span slot="action" slot-scope="text, record">
          <a @click="handleEdit(record)">编辑</a>
          <a-divider type="vertical" />
          <a-dropdown>
            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
            <a-menu slot="overlay">
              <a-menu-item>
                <a @click="handleDetail(record)">详情</a>
              </a-menu-item>
              <a-menu-item>
                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
                  <a>删除</a>
                </a-popconfirm>
              </a-menu-item>
            </a-menu>
          </a-dropdown>
        </span>
      </a-table>
    </div>
    <tools-store-early-warning-modal ref="modalForm" @ok="modalFormOk"></tools-store-early-warning-modal>
  </a-card>
</template>
<script>
  import '@/assets/less/TableExpand.less'
  import { mixinDevice } from '@/utils/mixin'
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  import ToolsStoreEarlyWarningModal from './modules/ToolsStoreEarlyWarningModal.vue'
  export default {
    name: 'TmsStoreEarlyWarningList',
    mixins:[JeecgListMixin, mixinDevice],
    components: {
      ToolsStoreEarlyWarningModal
    },
    data () {
      return {
        description: 'tms_store_early warning管理页面',
        // è¡¨å¤´
        columns: [
          {
            title: '#',
            dataIndex: '',
            key:'rowIndex',
            width:60,
            align:"center",
            customRender:function (t,r,index) {
              return parseInt(index)+1;
            }
          },
          {
            title:'编码',
            align:"center",
            dataIndex: 'classifyId'
          },
          {
            title:'名称',
            align:"center",
            dataIndex: 'toolName'
          },
          {
            title:'工具类型',
            align:"center",
            dataIndex: 'toolType'
          },
          {
            title:'规格',
            align:"center",
            dataIndex: 'toolModel'
          },
          {
            title:'材质',
            align:"center",
            dataIndex: 'supplierId'
          },
          {
            title:'存储位置',
            align:"center",
            dataIndex: 'goodsShelvesId'
          },
          {
            title:'厂家',
            align:"center",
            dataIndex: 'supplierId'
          },
          {
            title:'库存上限',
            align:"center",
            dataIndex: 'highestInventory'
          },
          {
            title:'库存下限',
            align:"center",
            dataIndex: 'lowerInventory'
          },
          {
            title:'总库存数量',
            align:"center",
            dataIndex: 'totalCount'
          },
          {
            title:'可用库存数量',
            align:"center",
            dataIndex: 'availableQuantity'
          },
          {
            title:'状态;',
            align:"center",
            dataIndex: 'status'
          },
          {
            title:'备注',
            align:"center",
            dataIndex: 'remark'
          },
        ],
        url: {
          list: "tms/toolsStoreEarlyWarning/list",
          delete: "tms/toolsStoreEarlyWarning/delete",
          deleteBatch: "tools/tmsStoreEarlyWarning/deleteBatch",
          exportXlsUrl: "tools/tmsStoreEarlyWarning/exportXls",
          importExcelUrl: "toolsStoreEarlyWarning/importExcel",
        },
        dictOptions:{},
        superFieldList:[],
      }
    },
    created() {
    this.getSuperFieldList();
    },
    computed: {
      importExcelUrl: function(){
        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
      },
    },
    methods: {
      initDictConfig(){
      },
      getSuperFieldList(){
        let fieldList=[];
        fieldList.push({type:'string',value:'toolCode',text:'编码',dictCode:''})
        fieldList.push({type:'string',value:'toolName',text:'名称',dictCode:''})
        fieldList.push({type:'string',value:'toolType',text:'工具类型',dictCode:''})
        fieldList.push({type:'string',value:'toolModel',text:'规格',dictCode:''})
        fieldList.push({type:'string',value:'supplierId',text:'材质',dictCode:''})
        fieldList.push({type:'string',value:'goodsShelvesId',text:'存储位置',dictCode:''})
        fieldList.push({type:'string',value:'toolModel',text:'型号/图号',dictCode:''})
        fieldList.push({type:'string',value:'supplierId',text:'厂家',dictCode:''})
        fieldList.push({type:'string',value:'toolMaterial',text:'材质',dictCode:''})
        fieldList.push({type:'string',value:'totalCount',text:'总库存数量',dictCode:''})
        fieldList.push({type:'string',value:'availableQuantity',text:'可用库存数量',dictCode:''})
        fieldList.push({type:'BigDecimal',value:'lowerInventory',text:'库存下限',dictCode:''})
        fieldList.push({type:'string',value:'highestInventory',text:'库存上限',dictCode:''})
        fieldList.push({type:'string',value:'status',text:'状态;',dictCode:''})
        fieldList.push({type:'string',value:'remark',text:'备注',dictCode:''})
        fieldList.push({type:'string',value:'tenantId',text:'租户号',dictCode:''})
        this.superFieldList = fieldList
      }
    }
  }
</script>
<style scoped>
  @import '~@assets/less/common.less';
</style>
src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
<template>
  <a-spin :spinning="confirmLoading">
    <j-form-container :disabled="formDisabled">
      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
        <a-row>
          <a-col :span="8">
            <a-form-model-item label="分类编号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="classifyId">
              <a-input v-model="model.classifyId" placeholder="请输入分类编号"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="中文名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="chineseName">
              <a-input v-model="model.chineseName" placeholder="请输入中文名称"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="英文名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="foreignLanguageName">
              <a-input v-model="model.foreignLanguageName" placeholder="请输入英文名称"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="工具类型;1.通用
2.专用" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="applicationType">
              <a-input v-model="model.applicationType" placeholder="请输入工具类型;1.通用
2.专用"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="标准级别" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardLevel">
              <a-input v-model="model.standardLevel" placeholder="请输入标准级别"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="标准号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardCode">
              <a-input v-model="model.standardCode" placeholder="请输入标准号"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="型号/图号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toolModel">
              <a-input v-model="model.toolModel" placeholder="请输入型号/图号"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="厂家" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="supplierId">
              <a-input v-model="model.supplierId" placeholder="请输入厂家"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="仓库省份城市" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="provinceCity">
              <a-input v-model="model.provinceCity" placeholder="请输入仓库省份城市"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="库区/库号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="warehouseId">
              <a-input v-model="model.warehouseId" placeholder="请输入库区/库号"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="库位号;由库区+层+排+列组成,可以是多个库位号以英文点号分割的字符串。" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="positionCode">
              <a-input v-model="model.positionCode" placeholder="请输入库位号;由库区+层+排+列组成,可以是多个库位号以英文点号分割的字符串。"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="存储位置(偏那个厂区的库)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="storageLocation">
              <a-input v-model="model.storageLocation" placeholder="请输入存储位置(偏那个厂区的库)"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="计量主单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="mainUnit">
              <a-input v-model="model.mainUnit" placeholder="请输入计量主单位"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="计量辅单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="auxiliaryUnit">
              <a-input v-model="model.auxiliaryUnit" placeholder="请输入计量辅单位"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="计量主单位数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="mainCount">
              <a-input v-model="model.mainCount" placeholder="请输入计量主单位数量"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="计量辅单位数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="auxiliaryCount">
              <a-input v-model="model.auxiliaryCount" placeholder="请输入计量辅单位数量"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="是否有计量辅单位;1,有辅助单位2.无辅助单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="auxiliaryUnitFlag">
              <a-input v-model="model.auxiliaryUnitFlag" placeholder="请输入是否有计量辅单位;1,有辅助单位2.无辅助单位"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="单价" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="price">
              <a-input-number v-model="model.price" placeholder="请输入单价" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="最低库存" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lowerInventory">
              <a-input-number v-model="model.lowerInventory" placeholder="请输入最低库存" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="最高库存" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="highestInventory">
              <a-input v-model="model.highestInventory" placeholder="请输入最高库存"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="状态;1.启用
2.未启用" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="status">
              <a-input v-model="model.status" placeholder="请输入状态;1.启用
2.未启用"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
              <a-input v-model="model.remark" placeholder="请输入备注"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="租户号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="tenantId">
              <a-input v-model="model.tenantId" placeholder="请输入租户号"  ></a-input>
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </j-form-container>
  </a-spin>
</template>
<script>
  import { httpAction, getAction } from '@/api/manage'
  import { validateDuplicateValue } from '@/utils/util'
  export default {
    name: 'TmsStoreEarlyWarningForm',
    components: {
    },
    props: {
      //表单禁用
      disabled: {
        type: Boolean,
        default: false,
        required: false
      }
    },
    data () {
      return {
        model:{
         },
        labelCol: {
          xs: { span: 24 },
          sm: { span: 5 },
        },
        wrapperCol: {
          xs: { span: 24 },
          sm: { span: 16 },
        },
        confirmLoading: false,
        validatorRules: {
           classifyId: [
              { required: true, message: '请输入分类编号!'},
           ],
        },
        url: {
          add: "/org.jeecg.modules.tms/tmsStoreEarlyWarning/add",
          edit: "/org.jeecg.modules.tms/tmsStoreEarlyWarning/edit",
          queryById: "/org.jeecg.modules.tms/tmsStoreEarlyWarning/queryById"
        }
      }
    },
    computed: {
      formDisabled(){
        return this.disabled
      },
    },
    created () {
       //备份model原始值
      this.modelDefault = JSON.parse(JSON.stringify(this.model));
    },
    methods: {
      add () {
        this.edit(this.modelDefault);
      },
      edit (record) {
        this.model = Object.assign({}, record);
        this.visible = true;
      },
      submitForm () {
        const that = this;
        // è§¦å‘表单验证
        this.$refs.form.validate(valid => {
          if (valid) {
            that.confirmLoading = 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');
              }else{
                that.$message.warning(res.message);
              }
            }).finally(() => {
              that.confirmLoading = false;
            })
          }
        })
      },
    }
  }
</script>
src/views/tms/storeEarlyWarning/modules/ToolsStoreEarlyWarningModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
<template>
  <j-modal
    :title="title"
    :width="width"
    :visible="visible"
    switchFullscreen
    @ok="handleOk"
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @cancel="handleCancel"
    cancelText="关闭">
    <tms-store-early-warning-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></tms-store-early-warning-form>
  </j-modal>
</template>
<script>
  import TmsStoreEarlyWarningForm from './ToolsStoreEarlyWarningForm.vue'
  export default {
    name: 'TmsStoreEarlyWarningModal',
    components: {
      TmsStoreEarlyWarningForm
    },
    data () {
      return {
        title:'',
        width:1024,
        visible: false,
        disableSubmit: false
      }
    },
    methods: {
      add () {
        this.visible=true
        this.$nextTick(()=>{
          this.$refs.realForm.add();
        })
      },
      edit (record) {
        this.visible=true
        this.$nextTick(()=>{
          this.$refs.realForm.edit(record);
        })
      },
      close () {
        this.$emit('close');
        this.visible = false;
      },
      handleOk () {
        this.$refs.realForm.submitForm();
      },
      submitCallback(){
        this.$emit('ok');
        this.visible = false;
      },
      handleCancel () {
        this.close()
      }
    }
  }
</script>