已添加15个文件
已修改14个文件
3097 ■■■■■ 文件已修改
src/views/base/Secret.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/public/zghf.png 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/OperationCertificateApplyList.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/RepairOrderList.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/SysFileNameList.vue 319 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/depart/DepartManage.vue 416 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/depart/modules/DepartForm.vue 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/depart/modules/DepartList.vue 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/depart/modules/DepartModel.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/depart/modules/EquipmentList.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/depart/modules/PermissionTree.vue 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/depart/modules/TeamList.vue 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/depart/modules/TeamModal.vue 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/daily3MaintenanceOrder/EquipmentPrecisionCheckOrderModal.vue 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/daily3MaintenanceOrder/Maintenance3ReceiptModal.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/daily3MaintenanceOrder/StoveCategoryModal.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/dailyMaintenanceOrder/FinishDevolutionModal.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/malfunctionRepair/MalfunctionRepaireModal.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/operationCertificateApply/OperationCertificateApplyForm.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/operationCertificateApply/OperationCertificateApplyModal.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/repairorder/moudles/RepairOrderFaultAnalysisReport.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/repairorder/moudles/select/FaultReportRepair.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/repairorder/repairOrderExcuteDrawer.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/sysFileName/SysFileNameForm.vue 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/eam/modules/sysFileName/SysFileNameModal.vue 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/NewPermissionList.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/modules/SecretForm.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/modules/SecretModel.vue 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/user/Login.vue 364 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/base/Secret.vue
src/views/dashboard/public/zghf.png
src/views/eam/OperationCertificateApplyList.vue
@@ -43,7 +43,7 @@
      <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-button @click="handleAchievement" type="primary" icon="plus" v-if="selectedRowKeys.length == 1">成绩录入</a-button>
      <a-button @click="handleAchievement" type="primary" icon="plus" v-if="selectedRowKeys.length == 1 && selectionRows[0].auditStatus == 'audited'">成绩录入</a-button>
      <!-- é«˜çº§æŸ¥è¯¢åŒºåŸŸ -->
<!--      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>-->
      <a-dropdown v-if="selectedRowKeys.length > 0">
@@ -96,9 +96,48 @@
        </template>
        <span slot="action" slot-scope="text, record">
          <a @click="handleEdit(record)">编辑</a>
          <a-divider type="vertical" />
          <a-popconfirm
            v-if="record.auditStatus == 'created'"
            title="确认提交吗?"
            @confirm="() =>handleCommit(record, 'commit')"
          >
            <a>提交</a>
          </a-popconfirm>
          <a-popconfirm
            v-if="record.auditStatus == 'submitted'"
            title="确认撤回吗?"
            @confirm="() =>handleCommit(record, 'back')"
          >
            <a>撤回</a>
          </a-popconfirm>
          <a-popconfirm
            v-if="record.auditStatus == 'submitted' || record.auditStatus == 'approved'"
            title="确认驳回吗?"
            @confirm="() =>handleCommit(record, 'back')"
          >
            <a>驳回</a>
          </a-popconfirm>
          <a-divider
            v-if="record.auditStatus == 'created' || record.auditStatus == 'submitted'"
            type="vertical"
          />
          <a @click="handleEdit(record)" v-if="record.auditStatus == 'created'">编辑</a>
          <a-popconfirm
            v-if="record.auditStatus == 'submitted'"
            title="确认通过审批吗?"
            @confirm="() =>handleCommit(record, 'approved')"
          >
            <a>审批</a>
          </a-popconfirm>
          <a-popconfirm
            v-if="record.auditStatus == 'approved'"
            title="确认通过审核吗?"
            @confirm="() =>handleCommit(record, 'audited')"
          >
            <a>审核</a>
          </a-popconfirm>
          <a-divider type="vertical" v-if="record.auditStatus == 'created' || record.auditStatus == 'submitted' || record.auditStatus == 'approved'"/>
          <a-dropdown>
            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
            <a-menu slot="overlay">
@@ -106,7 +145,7 @@
                <a @click="handleDetail(record)">详情</a>
              </a-menu-item>
              <a-menu-item>
                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)" v-if="record.auditStatus == 'created'">
                  <a>删除</a>
                </a-popconfirm>
              </a-menu-item>
@@ -136,6 +175,7 @@
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  import OperationCertificateApplyModal from './modules/operationCertificateApply/OperationCertificateApplyModal'
  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'
  import { getAction, postAction } from '@/api/manage'
  import OperationCertificateApplyDetailList from './modules/operationCertificateApply/OperationCertificateApplyDetailList'
  import '@/assets/less/TableExpand.less'
@@ -218,7 +258,7 @@
          deleteBatch: "/eam/operationCertificateApply/deleteBatch",
          exportXlsUrl: "/eam/operationCertificateApply/exportXls",
          importExcelUrl: "eam/operationCertificateApply/importExcel",
          approve:"/eam/operationCertificateApply/approve"
        },
        dictOptions:{},
        superFieldList:[],
@@ -246,6 +286,26 @@
        fieldList.push({type:'string',value:'remark',text:'备注',dictCode:''})
        this.superFieldList = fieldList
      },
      handleCommit(record, type) {
        if(type == 'commit'){
          record.auditStatus = 'submitted'
        }else if(type == 'back'){
          record.auditStatus = 'created'
        }else if(type == 'approved'){
          record.auditStatus = 'approved'
        }else if(type == 'audited'){
          record.auditStatus = 'audited'
        }
      postAction(this.url.approve, record).then(res => {
        if (res.success) {
          this.$message.success("操作成功!");
          this.loadData(1);
        } else {
          this.$message.warning(res.message);
        }
      })
    },
      handleEdit: function (record) {
      this.$refs.modalForm.edit(record);
      this.$refs.modalForm.title = "编辑";
src/views/eam/RepairOrderList.vue
@@ -104,11 +104,11 @@
              :sm="24"
          >
            <a-form-item
              label="车间"
              label="工区"
            >
              <j-dict-select-tag
                allow-clear
                placeholder="请选择资车间"
                placeholder="请选择资工区"
                :triggerChange="true"
                dictCode="mom_base_factory_model,name,id,del_flag!='1'"
                v-model="queryParam.factoryModelId"
@@ -439,7 +439,7 @@
import EquipmentDocumentList from './RepairOrderEquipmentDocumentList'
import '@/assets/less/TableExpand.less'
import { putAction } from '../../api/manage'
import RepairOrderAssignTask from './modules/repairorder/RepairOrderAssignTask.vue'
import RepairOrderAssignTask from './modules/repairorder/RepairOrderAssignTask'
import RepairOrderExcuteDrawer from './modules/repairorder/repairOrderExcuteDrawer'
import FaultDescriptionList from './FaultDescriptionList'
import FaultReportRepair from './modules/repairorder/moudles/select/FaultReportRepair.vue'
src/views/eam/SysFileNameList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,319 @@
<template>
  <a-card
    title="单据编码列表"
    :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.num"
              ></a-input>
            </a-form-item>
          </a-col>
          <a-col
            :xl="6"
            :lg="7"
            :md="8"
            :sm="24"
          >
            <a-form-item label="单据名称">
              <a-input
                placeholder="请输入单据名称"
                v-model="queryParam.name"
              ></a-input>
            </a-form-item>
          </a-col>
          <a-col
            :md="10"
            :sm="8"
          >
            <a-form-item label="版本状态">
              <!-- button-style="solid" -->
              <!-- size="small" -->
              <a-radio-group
                @change="onChange"
                default-value="2"
                v-model="queryParam.versionStatus"
              >
                <a-radio-button value="1">
                  æœªç”Ÿæ•ˆ
                </a-radio-button>
                <a-radio-button value="2">
                  å·²ç”Ÿæ•ˆ
                </a-radio-button>
                <a-radio-button value="3">
                  å·²å¤±æ•ˆ
                </a-radio-button>
              </a-radio-group>
            </a-form-item>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <div class="table-operator">
      <a-button
        @click="handleAdd"
        type="primary"
        icon="plus"
      >新增</a-button>
      <!-- v-has="'maintenanceCycle:add'" -->
      <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-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"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        class="j-table-force-nowrap"
        @change="handleTableChange"
      >
        <!-- :scroll="{ x: 'calc(950px + 50%)', y: 900 }" -->
        <!-- :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }" -->
        <span
          slot="action"
          slot-scope="text, record"
        >
          <a
            v-if="record.versionStatus == '2'"
            @click="handleRevise(record)"
          >升版</a>
          <!-- v-has="'maintenanceCycle:revise'" -->
          <a-divider type="vertical" />
          <a
            v-if="record.versionStatus == '1'"
            @click="handleTakeEffect(record)"
          >生效</a>
          <!-- v-has="'maintenanceCycle:takeEffect'" -->
          <a-divider type="vertical" />
          <a
            v-if="record.versionStatus == '1'"
            @click="handleEdit(record)"
          >编辑</a>
          <!-- v-has="'maintenanceCycle:edit'" -->
          <a-divider type="vertical" />
          <a-popconfirm
            v-if="record.versionStatus == '1'"
            title="确定删除吗?"
            @confirm="() => handleDelete(record.id)"
          >
            <!-- v-has="'maintenanceCycle:delete'" -->
            <a>删除</a>
          </a-popconfirm>
        </span>
      </a-table>
    </div>
    <sys-file-name-modal
      ref="modalForm"
      @ok="modalFormOk"
    ></sys-file-name-modal>
  </a-card>
</template>
<script>
import '@/assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import SysFileNameModal from './modules/sysFileName/SysFileNameModal'
import { deleteAction, getAction, postAction, requestPut } from '@/api/manage'
export default {
  name: 'SysFileNameList',
  mixins: [JeecgListMixin, mixinDevice],
  components: {
    SysFileNameModal,
  },
  data() {
    return {
      description: '单据编码',
      model: {},
      // è¡¨å¤´
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function (t, r, index) {
            return parseInt(index) + 1
          },
        },
        {
          title: '单据名称',
          align: 'center',
          dataIndex: 'name_dictText',
        },
        {
          title: '单据编码',
          align: 'center',
          dataIndex: 'num',
        },
        {
          title: '版本',
          align: 'center',
          dataIndex: 'version',
        },
        {
          title: '版本状态',
          align: 'center',
          dataIndex: 'versionStatus_dictText',
        },
        {
          title: '创建人',
          align: 'center',
          dataIndex: 'createBy',
        },
        {
          title: '创建日期',
          align: 'center',
          dataIndex: 'createTime',
        },
        {
          title: '操作',
          dataIndex: 'action',
          align: 'center',
          fixed: 'right',
          width: 147,
          scopedSlots: { customRender: 'action' },
        },
      ],
      url: {
        list: '/eam/sysFileName/list',
        delete: '/eam/sysFileName/delete',
        deleteBatch: '/eam/sysFileName/deleteBatch',
        versionTakeEffect: "/eam/sysFileName/versionTakeEffect",
      },
      visible: false,
    }
  },
  methods: {
    //升版
    handleRevise: function (record) {
      this.$refs.modalForm.revise(record);
      this.$refs.modalForm.title = "保养周期规则版本升级";
      this.$refs.modalForm.disableSubmit = false;
    },
    //生效
    handleTakeEffect(record) {
      const that = this;
      that.confirmLoading = true;
      this.$confirm({
        title: '单据编码版本生效!',
        content: '提示:版本生效后上一版本将自动失效,请谨慎操作!',
        okText: '确认',
        cancelText: '取消',
        onOk() {
          requestPut(that.url.versionTakeEffect, { id: record.id, name: record.name, versionStatus: '2' }).then((res) => {
            if (res.success) {
              that.$message.success("版本生效成功!")
              that.loadData(1)
            } else {
              that.$message.warning("版本生效失败!")
            }
          }).finally(() => {
            that.confirmLoading = false;
          })
        },
      })
    },
    onChange(e) {
      this.queryParam.versionStatus = e.target.value;
      this.loadData();
    },
    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) {
          //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;
          }
          //update-end---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
        } else {
          this.$message.warning(res.message)
        }
      }).finally(() => {
        this.loading = false
      })
    },
    handleCancel() {
      this.visible = false;
    },
  },
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>
src/views/eam/depart/DepartManage.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,416 @@
<template>
  <a-row
    type="flex"
    :gutter="16"
  >
    <a-col
      :md="5"
      :sm="24"
    >
    <a-card
    :loading="cardLoading"
    :bordered="false"
    title="部门树"
    style="height: 100%;"
  >
    <a-spin :spinning="loading">
      <a-alert
        type="info"
        :showIcon="true"
        style="margin-right: 54px;"
      >
        <div slot="message">
          å½“前:<span v-if="this.currSelected.title">{{ getCurrSelectedTitle() }}</span>
          <a
            v-if="this.currSelected.title"
            style="margin-left: 10px"
            @click="onClearSelected"
          >取消</a>
        </div>
      </a-alert>
      <div class="drawer-bootom-button">
        <a-dropdown
          :trigger="['click']"
          placement="bottomCenter"
        >
          <a-menu slot="overlay">
            <a-menu-item
              key="1"
              @click="expandAll"
            >展开所有</a-menu-item>
            <a-menu-item
              key="2"
              @click="closeAll"
            >合并所有</a-menu-item>
            <a-menu-item
              key="3"
              @click="refreshTree"
            >刷新</a-menu-item>
          </a-menu>
          <a-button>
            <a-icon type="bars" />
          </a-button>
        </a-dropdown>
      </div>
      <a-input-search
        @search="handleSearch"
        style="width:100%;margin-top: 10px"
        placeholder="设备分类"
        allowClear
        v-model="searchInput"
        @change="handleChange"
      />
      <a-tree
        showLine
        ref="tree"
        :checkStrictly="checkStrictly"
        :expandedKeys.sync="expandedKeys"
        :selectedKeys="selectedKeys"
        :dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
        :treeData="treeDataSource"
        :autoExpandParent="autoExpandParent"
        @select="onSelect"
        @expand="onExpand"
      >
      <template
          slot="title"
          slot-scope="{key,entity,title,isLeaf,value}"
        >
        <span>{{ title }}</span>
          <a-dropdown
            :trigger="['click']"
            placement="bottomCenter"
          >
            <a-menu slot="overlay">
              <a-menu-item v-if="key!='-1'">
                <a
                  href="javascript:;"
                  @click="handleEdit(entity)"
                >编辑</a>
              </a-menu-item>
              <a-menu-item>
                <a
                  href="javascript:;"
                  @click="handleAdd({parentId:value,orgCategory:'2'})"
                >
               æ·»åŠ å­ç±»åˆ«
                </a>
              </a-menu-item>
              <a-menu-item v-if="key!='-1'&&isLeaf">
                <a-popconfirm
                  title="确定删除吗?"
                  @confirm="() => handleDelete(entity.id)"
                >
                  <a>删除</a>
                </a-popconfirm>
              </a-menu-item>
            </a-menu>
            <span :style="{position: 'absolute',right: 0}">
              <a-icon type="down" />
            </span>
          </a-dropdown>
        </template>
      </a-tree>
    </a-spin>
  </a-card>
    </a-col>
    <a-col
      :md="24-5"
      :sm="24"
    >
    <a-card
    :bordered="false"
    class="card-area"
    title="关联列表"
    style="height: 100%;"
  >
    <a-tabs defaultActiveKey="1">
      <a-tab-pane tab="部门列表" key="1" forceRender>
        <depart-list :mainId="mainId"></depart-list>
      </a-tab-pane>
      <a-tab-pane tab="部门权限" key="2" forceRender v-if="false">
        <permission-tree :mainId="mainId"></permission-tree>
      </a-tab-pane>
      <a-tab-pane tab="设备列表" key="3" forceRender>
        <equipment-list :mainId="mainId"></equipment-list>
      </a-tab-pane>
      <a-tab-pane tab="班组列表" key="4" forceRender>
        <team-list :mainId="mainId"></team-list>
      </a-tab-pane>
    </a-tabs>
    </a-card>
    </a-col>
    <depart-model  ref='modalForm' @ok='modalFormOk' @reloadTree="refreshTree"></depart-model>
  </a-row>
</template>
<script>
import { getAction } from '@/api/manage'
import Tooltip from 'ant-design-vue/es/tooltip'
import JEllipsis from "@/components/jeecg/JEllipsis"
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import { deleteAction } from '../../../api/manage'
import DepartList from './modules/DepartList'
import PermissionTree from './modules/PermissionTree'
import EquipmentList from './modules/EquipmentList'
import TeamList from './modules/TeamList'
import DepartModel from './modules/DepartModel'
export default {
  name: 'DepartManage',
  mixins: [JeecgListMixin],
  components: {
    Tooltip,
    JEllipsis,
    DepartList,
    PermissionTree,
    EquipmentList,
    TeamList,
    DepartModel,
  },
  data() {
    return {
      description: '设备部门',
      searchInput: '',
      disableMixinCreated:true,
      cardLoading: false,
      loading: false,
      treeDataSource: [],
      selectedKeys: [],
      expandedKeys: [],
      mainId:'',
      url: {
        equipmentCategoryTreeList: '/sys/sysDepart/myTree',
        delete: "/sys/sysDepart/delete",
        list: "/eam/equipmentCategory/getAllChildren",
      },
      searchValue: '',
      dataList: [],
      autoExpandParent: true,
      checkStrictly: true,
      allTreeKeys: [],
      currSelected: {},
      hiding: false,
    }
  },
  created() {
    this.queryTreeData();
    this.closeAll();
  },
  methods: {
    getCurrSelectedTitle() {
      return !this.currSelected.title ? '' : this.currSelected.title;
    },
    onClearSelected() {
      this.hiding = true;
      this.currSelected = {};
      this.selectedKeys = [];
    },
    onSelect(selectedKeys, e) {
      this.hiding = false;
      let record = e.node.dataRef;
      this.currSelected = Object.assign({}, record);
      this.selectedKeys = [record.key];
      this.mainId = record.key;
    },
    onExpand(expandedKeys) {
      this.expandedKeys = expandedKeys;
      this.autoExpandParent = false;
    },
    queryTreeData() {
      this.loading = true;
      this.cardLoading = true;
      getAction(this.url.equipmentCategoryTreeList).then((res) => {
        if (res.success) {
          this.dataList = [];
          this.allTreeKeys = [];
          this.treeDataSource = res.result;
          this.generateList(res.result);
        } else {
          this.$message.warn(res.message);
        }
      }).finally(() => {
        this.loading = false;
        this.cardLoading = false;
      })
    },
    handleChange() {
      let search = this.searchInput;
      let expandedKeys = this.dataList
        .map(item => {
          if (item.title.indexOf(search) > -1) {
            return this.getParentKey(item.key, this.treeDataSource);
          }
          return null;
        })
        .filter((item, i, self) => item && self.indexOf(item) === i);
      Object.assign(this, {
        expandedKeys,
        searchValue: search,
        autoExpandParent: true,
      });
    },
    handleSearch(value) {
      let search = value;
      let expandedKeys = this.dataList
        .map(item => {
          if (item.title.indexOf(search) > -1) {
            return this.getParentKey(item.key, this.treeDataSource);
          }
          return null;
        })
        .filter((item, i, self) => item && self.indexOf(item) === i);
      Object.assign(this, {
        expandedKeys,
        searchValue: search,
        autoExpandParent: true,
      });
    },
    getParentKey(key, tree) {
      let parentKey;
      for (let i = 0; i < tree.length; i++) {
        const node = tree[i];
        if (node.children) {
          if (node.children.some(item => item.key === key)) {
            parentKey = node.key;
          } else if (
            this.getParentKey(key, node.children)) {
            parentKey = this.getParentKey(key, node.children);
          }
        }
      }
      return parentKey;
    },
    handleDelete(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.queryTreeData();
          that.$bus.$emit('loadData')
          that.alterFlag = new Date();
        } else {
          that.$message.warning(res.message);
        }
      });
    },
    generateList(data) {
      for (let i = 0; i < data.length; i++) {
        const node = data[i];
        const key = node.key;
        const title = node.title;
        // const type = node.type;
        this.dataList.push({ key, title: title });
        this.allTreeKeys.push(key);
        if (node.children) {
          this.generateList(node.children);
        }
      }
    },
    expandAll() {
      this.expandedKeys = this.allTreeKeys;
    },
    closeAll() {
      this.expandedKeys = ['-1'];
    },
    refreshTree() {
      this.queryTreeData();
    },
    handleAdd(record){
      this.$refs.modalForm.title = "新增"
      this.$refs.modalForm.add(record);
    }
  },
}
</script>
<style scoped>
@import '~@assets/less/common.less';
.replaceSearch {
  color: #00090f;
  font-weight: bold;
  background-color: rgb(204, 204, 204);
}
/* .ant-select-disabled {
  color: rgba(241, 16, 16, 0.25);
}
.ant-select-disabled .ant-select-selection {
  background: #a76b6b;
} */
/*隐藏树的默认icon*/
.ant-tree-switcher-noop {
  display: none !important;
}
/*隐藏树的默认竖线*/
.ant-tree.ant-tree-show-line li:not(:last-child):before {
  border-left: 0px;
}
.ant-card-body .table-operator {
  margin: 15px;
}
.anty-form-btn {
  width: 100%;
  text-align: center;
}
.anty-form-btn button {
  margin: 0 5px;
}
.anty-node-layout .ant-layout-header {
  padding-right: 0;
}
.header {
  padding: 0 8px;
}
.header button {
  margin: 0 3px;
}
.ant-modal-cust-warp {
  height: 100%;
}
.ant-modal-cust-warp .ant-modal-body {
  height: calc(100% - 110px) !important;
  overflow-y: auto;
}
.ant-modal-cust-warp .ant-modal-content {
  height: 90% !important;
  overflow-y: hidden;
}
#app .desktop {
  height: auto !important;
}
/** Button按钮间距 */
.ant-btn {
  margin-left: 3px;
}
.ant-alert {
  padding: 5px 15px 5px 37px;
}
.drawer-bootom-button {
  position: absolute;
  top: 1px;
  /* padding: 10px 16px; */
  text-align: left;
  right: 0;
  background: #fff;
  border-radius: 0 0 2px 2px;
}
</style>
src/views/eam/depart/modules/DepartForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,156 @@
<template>
  <a-spin :spinning="confirmLoading">
    <j-form-container :disabled="formDisabled">
      <a-form-model
        ref="form"
        :model="model"
        :rules="validatorRules"
        slot="detail"
      >
      <a-row :gutter="24">
          <a-col :span="24">
            <a-form-item
              :labelCol="labelCol"
              :wrapperCol="wrapperCol"
              label="父级部门"
              prop="parentId"
            >
              <j-dict-select-tag
                allow-clear
                placeholder="请选择父级部门"
                :triggerChange="true"
                dictCode="sys_depart,depart_name,id,del_flag = '0'"
                v-model="model.parentId"
                :disabled="true"
              />
            </a-form-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="24">
            <a-form-model-item
              label="编码"
              :labelCol="labelCol"
              :wrapperCol="wrapperCol"
              prop="orgCode"
            >
              <a-input
                v-model="model.orgCode"
                placeholder="请输入编码"
              ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="24">
            <a-form-model-item
              label="名称"
              :labelCol="labelCol"
              :wrapperCol="wrapperCol"
              prop="departName"
            >
              <a-input
                v-model="model.departName"
                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: 'RepairPlanTypeForm',
  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: {
        orgCode: [
          { required: true, message: '请输入编码!' },
          { validator: (rule, value, callback) => validateDuplicateValue('sys_depart', 'org_code', value, this.model.id, callback) },
        ],
        departName: [
          { required: true, message: '请输入名称!' },
          { validator: (rule, value, callback) => validateDuplicateValue('sys_depart', 'depart_name', value, this.model.id, callback) },
        ],
      },
      url: {
        add: "/sys/sysDepart/add",
        edit: "/sys/sysDepart/edit",
      }
    }
  },
  computed: {
    formDisabled() {
      return this.disabled
    },
  },
  created() {
    //备份model原始值
    this.modelDefault = JSON.parse(JSON.stringify(this.model));
  },
  methods: {
    add(record) {
      this.edit(record);
    },
    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/eam/depart/modules/DepartList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,169 @@
<template>
  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
        </a-row>
      </a-form>
    </div>
    <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"
        :scroll="{x:true}"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        @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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
            <a>删除</a>
          </a-popconfirm>
        </span>
      </a-table>
    </div>
  </a-card>
</template>
<script>
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  export default {
    name: "DepartList",
    mixins:[JeecgListMixin],
    components: { },
    props:{
      mainId:{
        type:String,
        default:'',
        required:false
      }
    },
    watch:{
      mainId:{
        immediate: true,
        handler(val) {
          if(!this.mainId){
            this.clearList()
          }else{
            this.queryParam['parentId'] = val
            this.queryParam['delFlag'] = '0'
            this.loadData(1);
          }
        }
      }
    },
    data () {
      return {
        description: '材料出库单管理页面',
        disableMixinCreated:true,
        // è¡¨å¤´
        columns: [
          {
            title: '#',
            dataIndex: '',
            key:'rowIndex',
            width:40,
            align:"center",
            customRender:function (t,r,index) {
              return parseInt(index)+1;
            }
          },
          {
            title:'部门编码',
            align:"center",
            dataIndex: 'orgCode',
            width:100,
          },
          {
            title:'部门名称',
            align:"center",
            dataIndex: 'departName',
            ellipsis:true,
            width:100,
          },
          {
            title:'创建人',
            align:"center",
            dataIndex: 'createBy',
            width:100,
          },
          {
            title:'创建日期',
            align:"center",
            dataIndex: 'createTime',
            width:100,
          },
          {
            title:'更新人',
            align:"center",
            dataIndex: 'updateBy',
            width:100,
          },
          {
            title:'更新日期',
            align:"center",
            dataIndex: 'updateTime',
            width:100,
          },
        ],
        url: {
          list: "/sys/sysDepart/list",
        },
        dictOptions:{
        }
      }
    },
    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/eam/depart/modules/DepartModel.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
<template>
  <j-modal
    :title="title"
    :width="width"
    :visible="visible"
    switchFullscreen
    @ok="handleOk"
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @cancel="handleCancel"
    >
    <depart-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></depart-form>
  </j-modal>
</template>
<script>
  import DepartForm from './DepartForm'
  export default {
    name: "DepartModal",
    components: {
        DepartForm
    },
    data () {
      return {
        title:'',
        width:800,
        visible: false,
        disableSubmit: false
      }
    },
    methods: {
      add (record) {
        this.visible=true
        this.$nextTick(()=>{
          this.$refs.realForm.add(record);
        })
      },
      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('reloadTree');
        this.visible = false;
      },
      handleCancel () {
        this.close()
      },
    }
  }
</script>
src/views/eam/depart/modules/EquipmentList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
<template>
  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
        </a-row>
      </a-form>
    </div>
    <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"
        :scroll="{x:true}"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        @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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
            <a>删除</a>
          </a-popconfirm>
        </span>
      </a-table>
    </div>
  </a-card>
</template>
<script>
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  export default {
    name: "EquipmentList",
    mixins:[JeecgListMixin],
    components: { },
    props:{
      mainId:{
        type:String,
        default:'',
        required:false
      }
    },
    watch:{
      mainId:{
        immediate: true,
        handler(val) {
          if(!this.mainId){
            this.clearList()
          }else{
            this.queryParam['useId'] = val
            this.loadData(1);
          }
        }
      }
    },
    data () {
      return {
        description: '材料出库单管理页面',
        disableMixinCreated:true,
        // è¡¨å¤´
        columns: [
          {
            title: '#',
            dataIndex: '',
            key:'rowIndex',
            width:40,
            align:"center",
            customRender:function (t,r,index) {
              return parseInt(index)+1;
            }
          },
          {
          title: '设备类型',
          align: "center",
          dataIndex: 'equipmentCategoryId_dictText',
          width:100
          },
        {
          title: '统一编码',
          align: "center",
          dataIndex: 'num',
          width:100
        },
        {
          title: '设备名称',
          align: "center",
          dataIndex: 'name',
          width:100
        },
        {
          title: '型号',
          align: "center",
          dataIndex: 'model',
          width:100
        },
        {
          title: '规格',
          align: "center",
          dataIndex: 'specification',
          width:100
        },
        ],
        url: {
          list: "/eam/equipment/getEquipmentList",
        },
        dictOptions:{
        }
      }
    },
    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/eam/depart/modules/PermissionTree.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,169 @@
<template>
  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
        </a-row>
      </a-form>
    </div>
    <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"
        :scroll="{x:true}"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
        @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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
            <a>删除</a>
          </a-popconfirm>
        </span>
      </a-table>
    </div>
  </a-card>
</template>
<script>
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  export default {
    name: "UpdateABC",
    mixins:[JeecgListMixin],
    components: { },
    props:{
      mainId:{
        type:String,
        default:'',
        required:false
      }
    },
    watch:{
      mainId:{
        immediate: true,
        handler(val) {
          if(!this.mainId){
            this.clearList()
          }else{
            this.queryParam['equipmentId'] = val
            this.queryParam['updateType'] = 'ABC'
            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:'ABC标识(旧)',
            align:"center",
            dataIndex: 'oldAbcTag_dictText',
            width:300
          },
          {
            title:'ABC标识(新)',
            align:"center",
            dataIndex: 'newAbcTag_dictText',
            width:300
          },
          {
            title:'变更日期',
            align:"center",
            dataIndex: 'updateDate',
            width:300
          },
          {
            title:'变更人',
            align:"center",
            dataIndex: 'updatePerson_dictText',
            width:300
          },
          {
            title:'备注',
            align:"center",
            dataIndex: 'remark',
            width:300
          },
        ],
        url: {
          list: "/eam/equipmentUpdateInfo/list",
        },
        dictOptions:{
        }
      }
    },
    created() {
    },
    computed: {
      importExcelUrl(){
        return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`;
      }
    },
    methods: {
      clearList(){
        this.dataSource=[]
        this.selectedRowKeys=[]
        this.ipagination.current = 1
      }
    },
    mounted(){
      this.$bus.$on('loadData', (data) => {
            this.loadData();
      });
    }
  }
</script>
<style scoped>
  @import '~@assets/less/common.less'
</style>
src/views/eam/depart/modules/TeamList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,179 @@
<template>
  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
        </a-row>
      </a-form>
    </div>
    <!-- <div class="table-operator">
      <a-button
        @click="handleAdd"
        type="primary"
        icon="plus"
      >新增班组</a-button>
    </div> -->
    <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"
        :scroll="{x:true}"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        @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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
            <a>删除</a>
          </a-popconfirm>
        </span>
      </a-table>
    </div>
    <team-modal ref='modalForm' @ok='modalFormOk' :mainId="mainId"></team-modal>
  </a-card>
</template>
<script>
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import TeamModal from './TeamModal.vue'
  export default {
    name: "TeamList",
    mixins:[JeecgListMixin],
    components: {TeamModal },
    props:{
      mainId:{
        type:String,
        default:'',
        required:false
      }
    },
    watch:{
      mainId:{
        immediate: true,
        handler(val) {
          if(!this.mainId){
            this.clearList()
          }else if(val!=='-1'){
            this.queryParam['departId'] = val
            this.queryParam['delFlag'] = '0'
            this.loadData(1);
          }else{
            this.queryParam['delFlag'] = '0'
            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: 'num',
            width:100
          },
          {
            title:'班组名称',
            align:"center",
            dataIndex: 'name',
            width:100
          },
          {
            title:'创建人',
            align:"center",
            dataIndex: 'createBy',
            width:100,
          },
          {
            title:'创建日期',
            align:"center",
            dataIndex: 'createTime',
            width:100,
          },
          {
            title:'更新人',
            align:"center",
            dataIndex: 'updateBy',
            width:100,
          },
          {
            title:'更新日期',
            align:"center",
            dataIndex: 'updateTime',
            width:100,
          },
        ],
        url: {
          list: "/base/team/list",
        },
        dictOptions:{
        }
      }
    },
    created() {
    },
    computed: {
      importExcelUrl(){
        return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`;
      }
    },
    methods: {
      clearList(){
        this.dataSource=[]
        this.selectedRowKeys=[]
        this.ipagination.current = 1
      },
      handleAdd(){
       this.$refs.modalForm.title = "新增"
       this.$refs.modalForm.visible = true;
      }
    },
  }
</script>
<style scoped>
  @import '~@assets/less/common.less'
</style>
src/views/eam/depart/modules/TeamModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,341 @@
<template>
  <a-modal
    :title="title"
    :width="1600"
    :visible="visible"
    :confirmLoading="confirmLoading"
    :okButtonProps="{ props: {disabled: disableSubmit} }"
    @ok="handleOk"
    @cancel="handleCancel"
    cancelText="关闭"
  >
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <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="单据号">
                  <j-input
                    placeholder="请输入单据号检索"
                    v-model="queryParam.num"
                  ></j-input>
                </a-form-item>
              </a-col>
              <a-col
                :md="6"
                :sm="8"
              >
                <a-form-item label="设备名称">
                  <j-input
                    placeholder="请输入设备名称检索"
                    v-model="queryParam.equipmentName"
                  ></j-input>
                </a-form-item>
              </a-col>
              <a-col
                :md="6"
                :sm="8"
              >
                <a-button
                  type="primary"
                  @click="searchQuery"
                  icon="search"
                >查询</a-button>
                <a-button
                  @click="searchReset"
                  icon="reload"
                  style="margin-left:8px;"
                >重置</a-button>
              </a-col>
            </a-row>
            <a-row :gutter="24">
              <a-col :span="24">
              </a-col>
            </a-row>
          </a-form>
        </div>
        <div style="margin-top:8px;">
          <a-table
            ref="table"
            size="middle"
            bordered
            rowKey="id"
            :columns="columns"
            :dataSource="dataSource"
            :pagination="ipagination"
            :loading="confirmLoading"
            @change="handleTableChange"
            :customRow="clickThenCheck"
            :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
          >
          <span slot="faultDescription" slot-scope="text">
            <j-ellipsis :value="text" :length="10" />
          </span>
          </a-table>
        </div>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
import { postAction, getAction } from '@/api/manage'
import JDate from '@/components/jeecg/JDate'
import Tooltip from 'ant-design-vue/es/tooltip'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import JEllipsis from '@/components/jeecg/JEllipsis'//引入过长裁剪
import store from '@/store'
export default {
  name: "FaultReportRepair",
  mixins: [JeecgListMixin],
  components: {
    JDate,
    Tooltip,
    JEllipsis,
    store
  },
  props:{
      mainId:{
        type:String,
        required:false,
        default:"",
      }
  },
  watch:{
      mainId:{
        immediate: true,
        handler(val) {
          if(!this.mainId){
            this.clearList()
          }else{
            this.queryParam['noEqId'] = val
            this.loadData(1);
          }
        }
      }
    },
  data() {
    return {
      title: "选择故障报修信息",
      visible: false,
      model: {},
      dataSource: [],
      disableSubmit: false,
      type: "radio",
      /* åˆ†é¡µå‚æ•° */
      ipagination: {
        current: 1,
        pageSize: 10,
        pageSizeOptions: ['10', '20', '30'],
        showTotal: (total, range) => {
          return range[0] + "-" + range[1] + " å…±" + total + "条"
        },
        showQuickJumper: true,
        showSizeChanger: true,
        total: 0
      },
      labelCol: {
        xs: { span: 24 },
        sm: { span: 6 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 18 },
      },
      confirmLoading: false,
      form: this.$form.createForm(this),
      columns: [
      {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: "center",
          customRender: function (t, r, index) {
            return parseInt(index) + 1;
          }
        },
        {
            title:'班组编码',
            align:"center",
            dataIndex: 'num',
            width:100
          },
          {
            title:'班组名称',
            align:"center",
            dataIndex: 'name',
            width:100
          },
          {
            title:'创建人',
            align:"center",
            dataIndex: 'createBy',
            width:100,
          },
          {
            title:'创建日期',
            align:"center",
            dataIndex: 'createTime',
            width:100,
          },
          {
            title:'更新人',
            align:"center",
            dataIndex: 'updateBy',
            width:100,
          },
          {
            title:'更新日期',
            align:"center",
            dataIndex: 'updateTime',
            width:100,
          },
      ],
      url: {
        list: "/base/team/list",
        add:  "/eam/repairOrder/addBySelectReport"
      },
    }
  },
  methods: {
    searchQuery() {
      this.loadData(1);
    },
    searchReset() {
      this.queryParam = {};
      this.loadData(1)
    },
    clickThenCheck(record) {
      return {
        on: {
          click: (e) => {
            this.selectedRowRecord = record;
            this.onSelectChange(record.id.split(","), [record]);
          }
        }
      };
    },
    onSelectChange(selectedRowKeys, selectionRows) {
      this.selectedRowKeys = selectedRowKeys;
      this.selectionRows = selectionRows;
    },
    close() {
      this.queryParam = {};
      this.$emit('close');
      this.visible = false;
    },
    handleOk() {
      const that = this;
      // è§¦å‘表单验证
      this.confirmLoading=true;
      if (that.selectedRowKeys.length === 0) {
        that.$message.error("请选择故障报修单后提交!")
        return false;
      }
      postAction(this.url.add,this.selectionRows).then(res=>{
        if(res.success){
          that.$message.success("领取成功!")
          that.$emit('ok');
        }else{
          that.$message.error("领取出现异常!")
        }
      }).finally(res=>{
        that.confirmLoading = false;
        that.close();
      });
    },
    handleCancel() {
      this.close();
    },
    clearList(){
        this.dataSource=[]
        this.selectedRowKeys=[]
        this.ipagination.current = 1
     },
  },
}
</script>
<style scoped>
.ant-btn {
  padding: 0 10px;
  margin-left: 3px;
}
.ant-form-item-control {
  line-height: 0px;
}
.fontweight {
  font-weight: bold;
}
/** ä¸»è¡¨å•行间距 */
.ant-form .ant-form-item {
  margin-bottom: 10px;
}
/** Tab页面行间距 */
.ant-tabs-content .ant-form-item {
  margin-bottom: 0px;
}
.ant-table-tbody .ant-table-row td {
  padding-top: 10px;
  padding-bottom: 10px;
}
.anty-row-operator button {
  margin: 0 5px;
}
.ant-btn-danger {
  background-color: #ffffff;
}
.ant-modal-cust-warp {
  height: 100%;
}
.ant-modal-cust-warp .ant-modal-body {
  height: calc(100% - 110px) !important;
  overflow-y: auto;
}
.ant-modal-cust-warp .ant-modal-content {
  height: 90% !important;
  overflow-y: hidden;
}
 .notshow {
  display: none;
}
.frozenRowClass {
  color: #c9c9c9;
}
.hight {
  color: #f5222d;
}
.middle {
  color: #fa8c16;
}
.low {
  color: #52c41a;
}
.dataUnKnow {
  color: #1890ff;
} .frozenRowClass {
  color: #c9c9c9;
}
</style>
src/views/eam/modules/daily3MaintenanceOrder/EquipmentPrecisionCheckOrderModal.vue
@@ -7,14 +7,20 @@
    cancelText="关闭"
    @cancel="handleCancel"
    :confirmLoading="confirmLoading"
    title="附录6"
  >
    <!-- :title="title" -->
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <span
          class="ant-descriptions-title"
          style="font-size: large;font-size: 15px;float: right;"
        >{{this.model.receiptsNum2}}</span>
        <a-divider
          orientation="center"
          style="font-size: large;font-style: normal;font-size: 30px;color: #66aeed;"
        > ç”Ÿäº§è®¾å¤‡ç²¾åº¦æ£€éªŒå• </a-divider>
        > {{this.model.receiptsName2}} </a-divider>
        <!-- ç”Ÿäº§è®¾å¤‡ç²¾åº¦æ£€éªŒå• -->
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-item
@@ -380,6 +386,7 @@
        add: "/eam/precisionInspection/precisionInspection",
        getPrecisionInspection: "/eam/precisionInspection/getPrecisionInspectionList",
        list: "/eam/dailyMaintenanceOrder/getMaintenanceCycleByStandardId",
        getSysFileName: "/eam/sysFileName/getSysFileName",
      },
    }
@@ -389,7 +396,9 @@
    edit(record) {
      let that = this;
      if (record.receipts2 == "" || record.receipts2 == null) {
        this.getSysFileName()
      }
      this.form.resetFields();
      // record.eachTolerance = '0'
      // record.partTolerance = '0'
@@ -456,8 +465,7 @@
      getAction(this.url.getPrecisionInspection, { maintenanceOrderId: this.model.id }).then((res) => {
        if (res.success) {
          this.dataSource = res.result[0].precisionInspectionDetails
          this.model = Object.assign({}, res.result[0]);
          debugger
          this.model = Object.assign(this.model, res.result[0]);
        }
      })
    },
@@ -515,6 +523,14 @@
      }
    },
    getSysFileName() {
      getAction(this.url.getSysFileName, { name: '16' }).then((res) => {
        if (res.success) {
          this.model = Object.assign(this.model, res.result[0]);
        }
      })
    },
  },
}
</script>
src/views/eam/modules/daily3MaintenanceOrder/Maintenance3ReceiptModal.vue
@@ -7,14 +7,20 @@
    cancelText="关闭"
    @cancel="handleCancel"
    :confirmLoading="confirmLoading"
    title="附录4"
  >
    <!-- :title="title" -->
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <span
          class="ant-descriptions-title"
          style="font-size: large;font-size: 15px;float: right;"
        >{{this.model.receiptsNum}}</span>
        <a-divider
          orientation="center"
          style="font-size: large;font-style: normal;font-size: 30px;color: #66aeed;"
        > ç”Ÿäº§è®¾å¤‡ä¸‰çº§ä¿å…»éªŒæ”¶å• </a-divider>
        > {{this.model.receiptsName}} </a-divider>
        <!-- ç”Ÿäº§è®¾å¤‡ä¸‰çº§ä¿å…»éªŒæ”¶å• -->
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-item
@@ -269,6 +275,7 @@
        add: "/eam/maintenanceThreeAcceptance/add",
        getMaintenance3Receipt: "/eam/maintenanceThreeAcceptance/getMaintenanceThreeAcceptanceList",
        list: "/eam/dailyMaintenanceOrder/getMaintenanceCycleByStandardId",
        getSysFileName: "/eam/sysFileName/getSysFileName",
      },
    }
  },
@@ -281,6 +288,10 @@
    edit(record) {
      let that = this;
      debugger
      if (record.receipts == "" || record.receipts == null) {
        this.getSysFileName()
      }
      this.form.resetFields();
      this.model = Object.assign({}, record);
      this.visible = true;
@@ -366,6 +377,14 @@
      }
    },
    getSysFileName() {
      getAction(this.url.getSysFileName, { name: '19' }).then((res) => {
        if (res.success) {
          this.model = Object.assign(this.model, res.result[0]);
        }
      })
    },
  },
}
</script>
src/views/eam/modules/daily3MaintenanceOrder/StoveCategoryModal.vue
@@ -7,16 +7,21 @@
    cancelText="关闭"
    @cancel="handleCancel"
    :confirmLoading="confirmLoading"
    title="附录5"
  >
    <!-- :title="title" -->
    <!-- <a-spin :spinning="confirmLoading"> -->
    <!-- <a-form :form="form"> -->
    <span
      class="ant-descriptions-title"
      style="font-size: large;font-size: 15px;float: right;"
    >{{this.model.receiptsNum}}</span>
    <a-divider
      orientation="center"
      style="font-size: large;font-style: normal;font-size: 30px;color: #66aeed;"
    > æ¸©åº¦å‡åŒ€æ€§æ£€æµ‹æ¡ä»¶ç¡®è®¤è¡¨ </a-divider>
    > {{this.model.receiptsName}} </a-divider>
    <!-- æ¸©åº¦å‡åŒ€æ€§æ£€æµ‹æ¡ä»¶ç¡®è®¤è¡¨ -->
    <!-- <div :style="{height: '115px',float: 'left',width: '100%',border: '1px solid #e9e9e9',padding: '50px 20px',background: '#fff',}"> -->
    <span
      class="ant-descriptions-title"
@@ -606,13 +611,13 @@
import pick from 'lodash.pick'
import JMultiSelectTag from '@/components/dict/JMultiSelectTag'
import Tooltip from 'ant-design-vue/es/tooltip'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
// import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import { getFileAccessHttpUrl } from '@/api/manage';
export default {
  name: "StoveCategoryModal",
  mixins: [JeecgListMixin],
  // mixins: [JeecgListMixin],
  components: {
    JMultiSelectTag,
    Tooltip,
src/views/eam/modules/dailyMaintenanceOrder/FinishDevolutionModal.vue
@@ -7,14 +7,19 @@
    cancelText="关闭"
    @cancel="handleCancel"
    :confirmLoading="confirmLoading"
    title="附录2"
  >
    <!-- :title="title" -->
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <span
          class="ant-descriptions-title"
          style="font-size: large;font-size: 15px;float: right;"
        >{{this.model.receiptsNum}}</span>
        <a-divider
          orientation="center"
          style="font-size: large;font-style: normal;font-size: 30px;color: #66aeed;"
        > ç”Ÿäº§è®¾å¤‡äºŒçº§ä¿å…»å®Œå·¥ç§»äº¤å• </a-divider>
        > {{this.model.receiptsName}} </a-divider>
        <!-- ç”Ÿäº§è®¾å¤‡äºŒçº§ä¿å…»å®Œå·¥ç§»äº¤å• -->
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-item
@@ -227,7 +232,7 @@
      codeDisable: true,
      dataSource: [],
      model: {},
      departs: [],
      // departs: [],
      labelCol: {
        xs: { span: 24 },
        sm: { span: 6 },
@@ -246,9 +251,9 @@
        },
      },
      url: {
        add: "/eam/dailyMaintenanceOrder/add",
        // add: "/eam/dailyMaintenanceOrder/add",
        edit: "/eam/dailyMaintenanceOrder/approve",
        getSysDeparts: "/eam/dailyMaintenanceOrder/getSysDeparts",
        getSysFileName: "/eam/sysFileName/getSysFileName",
        list: "/eam/dailyMaintenanceOrder/getMaintenanceCycleByStandardId",
      },
@@ -259,7 +264,9 @@
    edit(record) {
      let that = this;
      this.getSysDeparts()
      if (record.receipts == "" || record.receipts == null) {
        this.getSysFileName()
      }
      this.form.resetFields();
      this.model = Object.assign({}, record);
      this.visible = true;
@@ -313,10 +320,10 @@
    },
    getSysDeparts() {
      getAction(this.url.getSysDeparts).then((res) => {
    getSysFileName() {
      getAction(this.url.getSysFileName, { name: '15' }).then((res) => {
        if (res.success) {
          this.departs = res.result
          this.model = Object.assign(this.model, res.result[0]);
        }
      })
    },
src/views/eam/modules/malfunctionRepair/MalfunctionRepaireModal.vue
@@ -33,7 +33,6 @@
            >
              <j-dict-select-tag
                allow-clear
                :disabled="true"
                :placeholder="disableSubmit?'':'请选择是否停机维修'"
                :triggerChange="true"
                dictCode="is_stop"
@@ -373,7 +372,6 @@
      getAction(this.url.getNum,param).then(res=>{
          if(res.success){
             modelDefault.num = res.result;
             modelDefault.isStop = '2'
             modelDefault.faultTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss');
             that.edit(modelDefault);
          }
src/views/eam/modules/operationCertificateApply/OperationCertificateApplyForm.vue
@@ -88,7 +88,6 @@
  },
  data() {
    return {
      isAchievement:false,
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 }
@@ -123,7 +122,8 @@
          {
            title: '用户',
            key: 'userId',
            type: JVXETypes.userSelect,
            type: JVXETypes.selectSearch,
            dictCode: 'sys_user,realname,id ',
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: '',
@@ -142,7 +142,7 @@
          {
            title: '设备统一编码',
            key: 'equipmentIds',
            type: JVXETypes.selectSearch,
            type: JVXETypes.selectMultiple,
            dictCode: 'mom_eam_equipment,num,id ',
            width: '200px',
            placeholder: '请输入${title}',
@@ -181,7 +181,7 @@
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: '',
            disabled:false
            disabled:'achievementDisabled'
          },
          {
            title: '实操成绩',
@@ -190,7 +190,7 @@
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: '',
            disabled:false
            disabled:'achievementDisabled'
          },
          {
            title: '考试结论',
@@ -200,7 +200,7 @@
            width: '200px',
            placeholder: '请输入${title}',
            defaultValue: '',
            disabled:false
            disabled:'achievementDisabled'
          },
          // {
          //   title: '状态',
@@ -231,10 +231,18 @@
      default: false,
      required: false
    },
    achievement: {
      type: Boolean,
      default: false,
      required: false
    },
  },
  computed: {
    formDisabled() {
      return this.disabled
    },
    achievementDisabled() {
      return this.achievement
    }
  },
  created() {
@@ -300,13 +308,15 @@
      console.log("formData===>",formData);
      httpAction(url, formData, method).then((res) => {
        if (res.success) {
          httpAction(this.url.addOperationCertificate, formData.operationCertificateApplyDetailList, 'post').then((res) => {
            if (res.success) {
              this.$message.success(res.message)
            }else {
              this.$message.warning(res.message)
            }
          })
          if(this.achievementDisabled){
            httpAction(this.url.addOperationCertificate, formData.operationCertificateApplyDetailList, 'post').then((res) => {
              if (res.success) {
                this.$message.success(res.message)
              }else {
                this.$message.warning(res.message)
              }
            })
          }
          this.$message.success(res.message)
          this.$emit('ok')
          this.close()
src/views/eam/modules/operationCertificateApply/OperationCertificateApplyModal.vue
@@ -8,7 +8,7 @@
    @ok="handleOk"
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @cancel="handleCancel">
    <operation-certificate-apply-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"/>
    <operation-certificate-apply-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" :achievement="isAchievement"/>
  </j-modal>
</template>
@@ -27,7 +27,7 @@
        width:800,
        visible: false,
        disableSubmit: false,
        isAchievement:false
        isAchievement: false
      }
    },
    methods:{
@@ -41,7 +41,6 @@
        this.visible=true
        this.$nextTick(()=>{
          this.$refs.realForm.edit(record);
          this.$refs.realForm.isAchievement = true;
        })
      },
      close () {
src/views/eam/modules/repairorder/moudles/RepairOrderFaultAnalysisReport.vue
@@ -19,7 +19,7 @@
                allow-clear
                placeholder='请选择故障类型'
                :triggerChange='true'
                :disabled="isEdit"
                :disabled="isEdit||repairOrder.status!=='3'"
                dictCode="mom_eam_fault_type,name,id,del_flag!='1'"
                v-decorator="['faultTypeId', validatorRules.faultTypeId ]"
              />
@@ -34,7 +34,7 @@
              <a-textarea
                placeholder='请输入故障分析'
                v-decorator="['faultCause', validatorRules.faultCause]"
                :disabled="isEdit"
                :disabled="isEdit||repairOrder.status!=='3'"
              ></a-textarea>
            </a-form-item>
          </a-col>
@@ -49,7 +49,7 @@
              <a-textarea
                placeholder='请输入维修措施'
                v-decorator="['maintenanceMeasures', validatorRules.maintenanceMeasures]"
                :disabled="isEdit"
                :disabled="isEdit||repairOrder.status!=='3'"
              ></a-textarea>
            </a-form-item>
          </a-col>
@@ -62,7 +62,7 @@
              <a-textarea
                v-decorator="['suggestion', validatorRules.suggestion]"
                placeholder='请输入维保意见'
                :disabled="isEdit"
                :disabled="isEdit||repairOrder.status!=='3'"
              ></a-textarea>
            </a-form-item>
          </a-col>
@@ -96,6 +96,10 @@
   repairOrderId: {
      type: String,
      default:'',
    },
    repairOrder:{
      type: Object,
      default:{},
    }
  },
  watch:{
src/views/eam/modules/repairorder/moudles/select/FaultReportRepair.vue
@@ -300,6 +300,7 @@
    handleOk() {
      const that = this;
      // è§¦å‘表单验证
      this.confirmLoading=true;
      if (that.selectedRowKeys.length === 0) {
        that.$message.error("请选择故障报修单后提交!")
        return false;
src/views/eam/modules/repairorder/repairOrderExcuteDrawer.vue
@@ -237,7 +237,7 @@
                :repairOrderId="repairOrder.id"
                :repairOrderStatus="repairOrder.status"
              ></fault-analysis-edit-table> -->
              <RepairOrderFaultAnalysisList :repairOrderId="repairOrderId" />
              <RepairOrderFaultAnalysisList :repairOrderId="repairOrderId" :repairOrder="repairOrder"/>
            </a-tab-pane>
            <a-tab-pane
              tab='实际工时'
@@ -309,6 +309,10 @@
    repairOrderId: {
      type: String,
      default:'',
    },
    status:{
      type: String,
      default:'',
    }
  },
  data() {
src/views/eam/modules/sysFileName/SysFileNameForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,234 @@
<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="24">
            <a-form-model-item
              label="单据名称"
              :labelCol="labelCol"
              :wrapperCol="wrapperCol"
              prop="name"
            >
              <j-dict-select-tag
                placeholder="请选择单据名称"
                :triggerChange="true"
                dictCode="sys_file_name"
                v-model="model.name"
              />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="24">
            <a-form-model-item
              label="单据编码"
              :labelCol="labelCol"
              :wrapperCol="wrapperCol"
              prop="num"
            >
              <a-input
                v-model="model.num"
                placeholder="请输入单据编码"
              ></a-input>
            </a-form-model-item>
          </a-col>
          <!-- <a-col :span="24">
            <a-form-model-item
              label="单据名称"
              :labelCol="labelCol"
              :wrapperCol="wrapperCol"
              prop="name"
            >
              <a-input
                v-model="model.name"
                placeholder="请输入单据名称"
              ></a-input>
            </a-form-model-item>
          </a-col> -->
        </a-row>
        <a-row>
          <a-col :span="24">
            <a-form-model-item
              label="版本"
              :labelCol="labelCol"
              :wrapperCol="wrapperCol"
              prop="version"
            >
              <a-input
                v-model="model.version"
                placeholder="请输入版本号"
                :disabled=true
              ></a-input>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col
            v-if=" model.isRevise == true"
            :span="24"
          >
            <a-form-model-item
              label="历史版本"
              :labelCol="labelCol"
              :wrapperCol="wrapperCol"
              prop="version"
            >
              <a-input
                v-model="model.historyVersion"
                placeholder="请输入历史版本"
                :disabled=true
              ></a-input>
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </j-form-container>
  </a-spin>
</template>
<script>
import { httpAction, getAction, requestPut } from '@/api/manage'
import { validateDuplicateValue } from '@/utils/util'
import pick from 'lodash.pick'
import JMultiSelectTag from '@/components/dict/JMultiSelectTag'
export default {
  name: 'SysFileNameForm',
  components: { JMultiSelectTag },
  props: {
    //表单禁用
    disabled: {
      type: Boolean,
      default: false,
      required: false,
    },
    // enterpriseId: {
    //   type: String,
    //   default: '',
    //   required: false,
    // },
    // version: {
    //   type: Number,
    //   required: false,
    // },
  },
  data() {
    return {
      model: {},
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 },
      },
      confirmLoading: false,
      validatorRules: {
        name: [
          { required: true, message: '请选择单据名称!' },
        ],
        num: [
          { required: true, message: '请输入单据编码!' },
        ],
        version: [
          { required: true, message: '请输入版本号!' },
        ],
      },
      url: {
        add: '/eam/sysFileName/add',
        edit: '/eam/sysFileName/edit',
        revise: '/eam/sysFileName/revise',
        getReviseVersion: "/eam/sysFileName/getReviseVersion",
      },
    }
  },
  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
      this.model.isRevise = false;
      //修改时
      if (record.id) {
        //新增时
      } else {
        this.model.version = '1.0'
        this.model.versionStatus = '1'
      }
    },
    //升版
    revise(record) {
      let that = this;
      that.visible = true;
      that.model = Object.assign({}, record)
      that.model.isRevise = true;
      that.model.historyVersion = record.version
      that.model.versionStatus = '1'
      requestPut(that.url.getReviseVersion, record).then((res) => {
        if (res.success) {
          that.model.version = res.result;
        }
      })
    },
    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 {
            if (this.model.isRevise) {
              httpurl += this.url.revise
              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/eam/modules/sysFileName/SysFileNameModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
<template>
  <j-modal
    :title="title"
    :width="width"
    :visible="visible"
    switchFullscreen
    @ok="handleOk"
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @cancel="handleCancel"
    cancelText="关闭"
  >
    <sys-file-name-form
      ref="realForm"
      @ok="submitCallback"
      :disabled="disableSubmit"
    ></sys-file-name-form>
  </j-modal>
</template>
<script>
import SysFileNameForm from './SysFileNameForm'
export default {
  name: 'SysFileNameModal',
  components: {
    SysFileNameForm
  },
  props: {
    //表单禁用
    disabled: {
      type: Boolean,
      default: false,
      required: false
    },
  },
  data() {
    return {
      title: '',
      width: 650,
      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);
      })
    },
    revise(record) {
      this.visible = true
      this.$nextTick(() => {
        this.$refs.realForm.revise(record);
      })
    },
    close() {
      this.$emit('close');
      this.visible = false;
    },
    handleOk() {
      this.$refs.realForm.submitForm();
    },
    submitCallback() {
      this.$emit('ok');
      this.visible = false;
    },
    handleCancel() {
      this.close()
    }
  }
}
</script>
src/views/system/NewPermissionList.vue
@@ -11,6 +11,7 @@
        type="primary"
        icon="delete">批量删除
      </a-button>
      <a-button @click="handleSecret" type="primary" icon="frown" v-if="selectionRows.length===1&&selectionRows[0].title==='芝麻开门'">查询</a-button>
    </div>
    <!-- table区域-begin -->
@@ -75,6 +76,7 @@
    <permission-modal ref="modalForm" @ok="modalFormOk"></permission-modal>
    <permission-data-rule-list ref="PermissionDataRuleList" @ok="modalFormOk"></permission-data-rule-list>
    <secret-model ref="secret"></secret-model>
  </a-card>
</template>
@@ -85,6 +87,7 @@
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  import PermissionDataRuleList from './PermissionDataRuleList'
  import JEllipsis from '@/components/jeecg/JEllipsis'
import SecretModel from './modules/SecretModel.vue'
  const columns = [
    {
@@ -147,7 +150,8 @@
    components: {
      PermissionDataRuleList,
      PermissionModal,
      JEllipsis
      JEllipsis,
        SecretModel
    },
    data() {
      return {
@@ -185,6 +189,10 @@
          })
        }
      },
      onSelectChange(selectedRowKeys, selectionRows) {
        this.selectedRowKeys = selectedRowKeys;
        this.selectionRows = selectionRows;
      },
      // æ ¹æ®å·²å±•开的行查询数据(用于保存后刷新时异步加载子级的数据)
      loadDataByExpandedRows(dataList) {
        if (this.expandedRowKeys.length > 0) {
@@ -220,6 +228,11 @@
      handleExpandedRowsChange(expandedRows) {
        this.expandedRowKeys = expandedRows
      },
      handleSecret(){
        this.$refs.secret.title='秘密'
        this.$refs.secret.add();
      }
    }
  }
</script>
src/views/system/modules/SecretForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,153 @@
<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="24">
            <a-form-model-item label="类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="type">
              <a-input v-model="model.type" placeholder="请输入类型"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="24">
            <a-form-model-item label="查询" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sql">
              <a-textarea v-model="model.sql" rows="4" placeholder="请输入查询" />
            </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: 'SecretForm',
    components: {
    },
    props: {
      //表单禁用
      disabled: {
        type: Boolean,
        default: false,
        required: false
      }
    },
    data () {
      return {
        name:'',
        code:'',
        model:{
         },
        labelCol: {
          xs: { span: 24 },
          sm: { span: 5 },
        },
        wrapperCol: {
          xs: { span: 24 },
          sm: { span: 16 },
        },
        confirmLoading: false,
        validatorRules: {
           type : [
              { required: true, message: '请输入sql类型!'},
           ],
           sql:[{ required: true, message: '请输入sql!'},]
        },
        url: {
          add: "/sys/permission/addSecret",
          edit: "/base/departmentCategory/edit",
          queryById: "/base/departmentCategory/queryById",
          check:"/base/departmentCategory/check"
        }
      }
    },
    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.name=this.model.name;
        this.code=this.model.code;
        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;
            })
          }
        })
      },
      validateCode(rule, value, callback){
        var params = {
        code:value,
        delFlag:'0',
      };
      getAction(this.url.check,params).then(res=>{
            if(res.result.length==0){
              callback();
            }
            else if(this.model.id&&this.code==value){
              callback();
            }
            else{
              callback('部门类型编码重复')
            }
        })
      },
      validateName(rule, value, callback){
        var params = {
        name:value,
        delFlag:'0',
      };
      getAction(this.url.check,params).then(res=>{
            if(res.result.length==0){
              callback();
            }
            else if(this.model.id&&this.name==value){
              callback();
            }
            else{
              callback('部门类型名称重复')
            }
        })
      },
    }
  }
</script>
src/views/system/modules/SecretModel.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
<template>
  <j-modal
    :title="title"
    :width="width"
    :visible="visible"
    switchFullscreen
    @ok="handleOk"
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @cancel="handleCancel"
    cancelText="关闭">
    <secret-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></secret-form>
  </j-modal>
</template>
<script>
  import SecretForm from './SecretForm.vue'
  export default {
    name: 'SecretModal',
    components: {
        SecretForm
    },
    data () {
      return {
        title:'',
        width:800,
        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>
src/views/user/Login.vue
@@ -1,35 +1,61 @@
<template>
  <div class="main">
    <a-form-model class="user-layout-login" @keyup.enter.native="handleSubmit">
      <a-tabs :activeKey="customActiveKey" :tabBarStyle="{ textAlign: 'center', borderBottom: 'unset' }"  @change="handleTabClick">
        <a-tab-pane key="tab1" tab="账号密码登录">
          <login-account ref="alogin" @validateFail="validateFail" @success="requestSuccess" @fail="requestFailed"></login-account>
    <a-form-model
      class="user-layout-login"
      @keyup.enter.native="handleSubmit"
    >
      <a-tabs
        :activeKey="customActiveKey"
        :tabBarStyle="{ textAlign: 'center', borderBottom: 'unset' }"
        @change="handleTabClick"
      >
        <a-tab-pane
          key="tab1"
          tab="账号密码登录"
        >
          <login-account
            ref="alogin"
            @validateFail="validateFail"
            @success="requestSuccess"
            @fail="requestFailed"
          ></login-account>
        </a-tab-pane>
        <!--<a-tab-pane key="tab2" tab="手机号登录">-->
          <!--<login-phone ref="plogin" @validateFail="validateFail" @success="requestSuccess" @fail="requestFailed"></login-phone>-->
        <!--<login-phone ref="plogin" @validateFail="validateFail" @success="requestSuccess" @fail="requestFailed"></login-phone>-->
        <!--</a-tab-pane>-->
      </a-tabs>
      <a-form-model-item>
        <!--<a-checkbox @change="handleRememberMeChange" default-checked>自动登录</a-checkbox>-->
        <!--<router-link :to="{ name: 'alteration'}" class="forge-password" style="float: right;">-->
          <!--忘记密码-->
        <!--忘记密码-->
        <!--</router-link>-->
        <!--<router-link :to="{ name: 'register'}" class="forge-password" style="float: right;margin-right: 10px" >-->
          <!--注册账户-->
        <!--注册账户-->
        <!--</router-link>-->
      </a-form-model-item>
      <a-form-item style="margin-top:24px">
        <a-button size="large"  type="primary"  htmlType="submit"  class="login-button"  :loading="loginBtn"  @click.stop.prevent="handleSubmit" :disabled="loginBtn">确定
        <a-button
          size="large"
          type="primary"
          htmlType="submit"
          class="login-button"
          :loading="loginBtn"
          @click.stop.prevent="handleSubmit"
          :disabled="loginBtn"
        >确定
        </a-button>
      </a-form-item>
    </a-form-model>
    <!--<two-step-captcha v-if="requiredTwoStepCaptcha" :visible="stepCaptchaVisible" @success="stepCaptchaSuccess" @cancel="stepCaptchaCancel"></two-step-captcha>-->
    <login-select-tenant ref="loginSelect" @success="loginSelectOk"></login-select-tenant>
    <login-select-tenant
      ref="loginSelect"
      @success="loginSelectOk"
    ></login-select-tenant>
    <!--<third-login ref="thirdLogin"></third-login>-->
  </div>
</template>
@@ -49,192 +75,194 @@
import { getAction } from '../../api/manage'
export default {
    components: {
      LoginSelectTenant,
      TwoStepCaptcha,
      // ThirdLogin,
      LoginAccount,
      LoginPhone,
      store
  components: {
    LoginSelectTenant,
    TwoStepCaptcha,
    // ThirdLogin,
    LoginAccount,
    LoginPhone,
    store
  },
  data() {
    return {
      customActiveKey: 'tab1',
      rememberMe: true,
      loginBtn: false,
      requiredTwoStepCaptcha: false,
      stepCaptchaVisible: false,
      encryptedString: {
        key: "",
        iv: "",
      },
      url: {
        getPrimaryInfo: "/sys/sysAnnouncementSend/getPrimaryInfo"
      }
    }
  },
  created() {
    Vue.ls.remove(ACCESS_TOKEN)
    this.getRouterData();
    this.rememberMe = true
  },
  methods: {
    handleTabClick(key) {
      this.customActiveKey = key
    },
    data () {
      return {
        customActiveKey: 'tab1',
        rememberMe: true,
        loginBtn: false,
        requiredTwoStepCaptcha: false,
        stepCaptchaVisible: false,
        encryptedString:{
          key:"",
          iv:"",
        },
        url:{
          getPrimaryInfo:"/sys/sysAnnouncementSend/getPrimaryInfo"
    handleRememberMeChange(e) {
      this.rememberMe = e.target.checked
    },
    /**跳转到登录页面的参数-账号获取*/
    getRouterData() {
      this.$nextTick(() => {
        let temp = this.$route.params.username || this.$route.query.username || ''
        if (temp) {
          this.$refs.alogin.acceptUsername(temp)
        }
      })
    },
    //登录
    handleSubmit() {
      this.loginBtn = true;
      if (this.customActiveKey === 'tab1') {
        // ä½¿ç”¨è´¦æˆ·å¯†ç ç™»å½•
        this.$refs.alogin.handleLogin(this.rememberMe)
      } else {
        //手机号码登录
        this.$refs.plogin.handleLogin(this.rememberMe)
      }
    },
    created() {
      Vue.ls.remove(ACCESS_TOKEN)
      this.getRouterData();
      this.rememberMe = true
    // æ ¡éªŒå¤±è´¥
    validateFail() {
      this.loginBtn = false;
    },
    methods:{
      handleTabClick(key){
        this.customActiveKey = key
      },
      handleRememberMeChange(e){
        this.rememberMe = e.target.checked
      },
      /**跳转到登录页面的参数-账号获取*/
      getRouterData(){
        this.$nextTick(() => {
          let temp = this.$route.params.username || this.$route.query.username || ''
          if (temp) {
            this.$refs.alogin.acceptUsername(temp)
    // ç™»å½•后台成功
    requestSuccess(loginResult) {
      this.$router.push({ path: "/isps/userAnnouncement" }).catch(() => {
        console.log('登录跳转首页出错,这个错误从哪里来的')
      })
      this.$notification.success({
        message: '欢迎',
        description: `${timeFix()},欢迎回来`,
      });
      var userId = store.getters.userInfo.id;
      let that = this;
      getAction(this.url.getPrimaryInfo, { userId: userId }).then(res => {
        if (res.success) {
          for (var i = 0; i < res.result.length; i++) {
            that.$notification.success({
              message: '最新未读消息【' + res.result[i].msgCategory + '】',
              description: res.result[i].msgContent,
              duration: 60,
              icon: <a-icon type="exclamation-circle" style="color:red" />,
            });
          }
        })
      },
      //登录
      handleSubmit () {
        this.loginBtn = true;
        if (this.customActiveKey === 'tab1') {
          // ä½¿ç”¨è´¦æˆ·å¯†ç ç™»å½•
          this.$refs.alogin.handleLogin(this.rememberMe)
        } else {
          //手机号码登录
          this.$refs.plogin.handleLogin(this.rememberMe)
        }
      },
      // æ ¡éªŒå¤±è´¥
      validateFail(){
        this.loginBtn = false;
      },
      // ç™»å½•后台成功
      requestSuccess(loginResult){
        this.$router.push({ path: "/dashboard/analysis" }).catch(()=>{
          console.log('登录跳转首页出错,这个错误从哪里来的')
        })
        this.$notification.success({
          message: '欢迎',
          description: `${timeFix()},欢迎回来`,
        });
        var userId = store.getters.userInfo.id;
        let that = this;
        getAction(this.url.getPrimaryInfo,{userId:userId}).then(res=>{
            if(res.success){
                for(var i=0;i<res.result.length;i++){
                  that.$notification.success({
                    message: '最新未读消息【'+res.result[i].msgCategory+'】',
                    description:res.result[i].msgContent,
                  });
                }
            }
        })
        // this.$refs.loginSelect.show(loginResult)
      },
      //登录后台失败
      requestFailed (err) {
        let description = ((err.response || {}).data || {}).message || err.message || "请求出现错误,请稍后再试"
        this.$notification[ 'error' ]({
          message: '登录失败',
          description: description,
          duration: 4,
        });
        //账户密码登录错误后更新验证码
        if(this.customActiveKey === 'tab1' && description.indexOf('密码错误')>0){
          this.$refs.alogin.handleChangeCheckCode()
        }
        this.loginBtn = false;
      },
      loginSelectOk(){
        this.loginSuccess()
      },
      //登录成功
      loginSuccess () {
        this.$router.push({ path: "/dashboard/analysis" }).catch(()=>{
          console.log('登录跳转首页出错,这个错误从哪里来的')
        })
        this.$notification.success({
          message: '欢迎',
          description: `${timeFix()},欢迎回来`,
        });
      },
      stepCaptchaSuccess () {
        this.loginSuccess()
      },
      stepCaptchaCancel () {
        this.Logout().then(() => {
          this.loginBtn = false
          this.stepCaptchaVisible = false
        })
      },
      //获取密码加密规则
      getEncrypte(){
        var encryptedString = Vue.ls.get(ENCRYPTED_STRING);
        if(encryptedString == null){
          getEncryptedString().then((data) => {
            this.encryptedString = data
          });
        }else{
          this.encryptedString = encryptedString;
        }
      })
      // this.$refs.loginSelect.show(loginResult)
    },
    //登录后台失败
    requestFailed(err) {
      let description = ((err.response || {}).data || {}).message || err.message || "请求出现错误,请稍后再试"
      this.$notification['error']({
        message: '登录失败',
        description: description,
        duration: 4,
      });
      //账户密码登录错误后更新验证码
      if (this.customActiveKey === 'tab1' && description.indexOf('密码错误') > 0) {
        this.$refs.alogin.handleChangeCheckCode()
      }
      this.loginBtn = false;
    },
    loginSelectOk() {
      this.loginSuccess()
    },
    //登录成功
    loginSuccess() {
      this.$router.push({ path: "/isps/userAnnouncement" }).catch(() => {
        console.log('登录跳转首页出错,这个错误从哪里来的')
      })
      this.$notification.success({
        message: '欢迎',
        description: `${timeFix()},欢迎回来`,
      });
    },
    stepCaptchaSuccess() {
      this.loginSuccess()
    },
    stepCaptchaCancel() {
      this.Logout().then(() => {
        this.loginBtn = false
        this.stepCaptchaVisible = false
      })
    },
    //获取密码加密规则
    getEncrypte() {
      var encryptedString = Vue.ls.get(ENCRYPTED_STRING);
      if (encryptedString == null) {
        getEncryptedString().then((data) => {
          this.encryptedString = data
        });
      } else {
        this.encryptedString = encryptedString;
      }
    }
  }
}
</script>
<style lang="less" scoped>
  .user-layout-login {
    label {
      font-size: 14px;
    }
.user-layout-login {
  label {
    font-size: 14px;
  }
  .getCaptcha {
      display: block;
      width: 100%;
      height: 40px;
    }
    display: block;
    width: 100%;
    height: 40px;
  }
  .forge-password {
      font-size: 14px;
    }
    font-size: 14px;
  }
    button.login-button {
      padding: 0 15px;
      font-size: 16px;
      height: 40px;
      width: 100%;
    }
  button.login-button {
    padding: 0 15px;
    font-size: 16px;
    height: 40px;
    width: 100%;
  }
  .user-login-other {
      text-align: left;
      margin-top: 24px;
      line-height: 22px;
    text-align: left;
    margin-top: 24px;
    line-height: 22px;
    .item-icon {
        font-size: 24px;
        color: rgba(0,0,0,.2);
        margin-left: 16px;
        vertical-align: middle;
        cursor: pointer;
        transition: color .3s;
      font-size: 24px;
      color: rgba(0, 0, 0, 0.2);
      margin-left: 16px;
      vertical-align: middle;
      cursor: pointer;
      transition: color 0.3s;
      &:hover {
          color: #1890ff;
        }
      }
    .register {
        float: right;
        color: #1890ff;
      }
    }
    .register {
      float: right;
    }
  }
}
</style>
<style>
  .valid-error .ant-select-selection__placeholder{
    color: #f5222d;
  }
.valid-error .ant-select-selection__placeholder {
  color: #f5222d;
}
</style>