1、利用率分段分析页面增加导出功能,默认进入页面的计算时间段修改为00:00至23:59
2、设备管理页面增加设备属性的维护(普通、重点)同时TEEP页面新增对应筛选条件
3、看板增加MES产量数据展示(饼图里面改为设备产量对比,饼图下方增加两行展示计划量和完成量数目,点击饼图出现弹窗展示对应车间或车间工段下产量列表)2h
4、设备管理页面新增字段展示权限(弹窗中设备状态字段增加菜单按钮权限控制显隐)
5、OEE计算弹窗新增loading提示与计算成功后刷新列表功能
6、删除用户管理冗余字段展示
已添加1个文件
已修改11个文件
636 ■■■■ 文件已修改
src/api/signage.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/EquipmentList.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/WorkshopSignage.vue 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/EquipmentList/UserModal.vue 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/OEEAnalysis/ComputeOeeModal.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/OpenRateFractionAnalysis/OpenRateFractionAnalysisMain.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/WorkshopSignage/SignageModal.vue 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/WorkshopSignage/WorkshopDeviceOverview.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/efficiencyReport/EfficiencyList.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/UserList.vue 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/modules/UserModal.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/signage.js
@@ -24,5 +24,9 @@
  // ç¼–辑车间信息
  editWorkshopApi: params => putAction('/mdc/mdcWorkshopInfo/edit', params),
  // èŽ·å–äºŒçº§è½¦é—´ä¿¡æ¯
  getWorkshopListApi: () => getAction('/mdc/mdcWorkshopInfo/getProductionList')
  getWorkshopListApi: () => getAction('/mdc/mdcWorkshopInfo/getProductionList'),
  // èŽ·å–è½¦é—´ä¸‹å·¥æ®µåˆ—è¡¨
  getSectionListApi: productionId => getAction('/mdc/largeScreen/productionList', { productionId }),
  // èŽ·å–è½¦é—´mes产量列表
  getMesProductionListApi: params => getAction('/mdc/mdcEquipmentOverFla/list', params)
}
src/views/mdc/base/EquipmentList.vue
@@ -280,6 +280,12 @@
                  dataIndex:'equipmentStatus_dictText'
                },
                {
                  title:'设备属性',
                  align:'center',
                  width: 100,
                  dataIndex:'attribute_dicText'
                },
                {
                  title: '机床IP',
                  align: 'center',
                  width: 150,
src/views/mdc/base/WorkshopSignage.vue
@@ -5,7 +5,8 @@
      <div class="left-col">
        <div class="col-content">
          <div class="content-title">{{workshopDetails.workshopName}}#设备情况</div>
          <workshop-device-overview ref="workshopDeviceOverviewRef" :currentProductionId="currentProductionId"
          <workshop-device-overview ref="workshopDeviceOverviewRef" :workshopName="workshopDetails.workshopName"
                                    :currentProductionId="currentProductionId"
                                    :equipmentStatusList="equipmentStatusList" :toDecimal2NoZero="toDecimal2NoZero"/>
        </div>
        <div class="col-content">
@@ -208,15 +209,15 @@
            padding: 1% 5%;
          }
          .content-footer-container {
            height: 25%;
          /*.content-footer-container {*/
          /*height: 25%;*/
            .content-footer {
              font-size: 0.7vw;
              padding-left: 5%;
              height: 40%;
            }
          }
          /*.content-footer {*/
          /*font-size: 0.7vw;*/
          /*padding-left: 5%;*/
          /*height: 40%;*/
          /*}*/
          /*}*/
          .chart-container {
            flex: 1;
src/views/mdc/base/modules/EquipmentList/UserModal.vue
@@ -19,17 +19,18 @@
    </template>
    <a-spin :spinning="confirmLoading">
      <a-form-model ref="form" :form="form" :model="model" :rules="validatorRules">
      <a-form-model ref="form" :form="form" :model="model" :rules="validatorRules" :labelCol="labelCol"
                    :wrapperCol="wrapperCol">
        <a-row :gutter="24">
          <a-col :span="12">
            <a-form-model-item label="统一编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="equipmentId">
            <a-form-model-item label="统一编码" prop="equipmentId">
              <a-input-search :readOnly="true"
                              v-model="model.equipmentId"
                              :disabled="disSearch"   @search="deviceSearch" enter-button placeholder='请选择统一编码' />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="设备名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
            <a-form-model-item label="设备名称">
              <a-input :disabled="disSearch" :readOnly="disableSubmit" allow-clear placeholder="请输入设备名称"
                       v-model="model.equipmentName"/>
            </a-form-model-item>
@@ -38,11 +39,13 @@
        <a-row :gutter="24">
          <a-col :span="12">
            <a-form-model-item  v-if="isDepartType == 0" label="部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
              <j-select-equipment-depart :disabled="disableSubmit" v-model="model.selectedDeparts" :multi="false" @back="backDepartInfo" :backDepart="true" :treeOpera="true"></j-select-equipment-depart>
            <a-form-model-item v-if="isDepartType == 0" label="部门分配" v-show="!departDisabled">
              <j-select-equipment-depart :disabled="disableSubmit" v-model="model.selectedDeparts" :multi="false"
                                         @back="backDepartInfo" :backDepart="true"
                                         :treeOpera="true"></j-select-equipment-depart>
            </a-form-model-item>
            <a-form-model-item v-if="isDepartType == -1" label="设备类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
            <a-form-model-item v-if="isDepartType == -1" label="设备类型">
              <a-select :disabled="disableSubmit" :readOnly="disableSubmit" placeholder="请选择设备类型"
                        :triggerChange="true"
                        v-model="model.equipmentType">
@@ -53,16 +56,19 @@
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="车间分配" :labelCol="labelCol" :wrapperCol="wrapperCol"  v-show="!productionDisabled" ref="selectedProduction"  prop="selectedProduction">
            <a-form-model-item label="车间分配" v-show="!productionDisabled" ref="selectedProduction"
                               prop="selectedProduction">
              <!--<j-select-equipment-production  v-decorator="['selectedProduction',{rules:[{required:true,message:'请选择车间!'}]}]" :multi="false" @back="backProductionInfo" :backProduction="true" :treeProductOpera="true"></j-select-equipment-production>-->
              <j-select-equipment-production :disabled="disableSubmit"  v-model="model.selectedProduction" :multi="false" @back="backProductionInfo" :backProduction="true" :treeProductOpera="true"></j-select-equipment-production>
              <j-select-equipment-production :disabled="disableSubmit" v-model="model.selectedProduction" :multi="false"
                                             @back="backProductionInfo" :backProduction="true"
                                             :treeProductOpera="true"></j-select-equipment-production>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="12">
            <a-form-model-item v-if="isDepartType == 0" label="设备类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
            <a-form-model-item v-if="isDepartType == 0" label="设备类型">
            <a-select :disabled="disableSubmit" :readOnly="disableSubmit" placeholder="请选择设备类型"
              :triggerChange="true"
                      v-model="model.equipmentType">
@@ -77,13 +83,13 @@
        <a-row :gutter="24">
          <a-col :span="12">
            <a-form-model-item label="机床IP" :labelCol="labelCol" :wrapperCol="wrapperCol">
            <a-form-model-item label="机床IP">
              <a-input :disabled="true" :readOnly="disableSubmit" placeholder="请输入机床IP"
                       v-model="model.equipmentIp"/>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="机床端口" :labelCol="labelCol" :wrapperCol="wrapperCol">
            <a-form-model-item label="机床端口">
              <a-input :disabled="true" :readOnly="disableSubmit" placeholder="请输入机床端口"
                       v-model="model.dataPort"/>
            </a-form-model-item>
@@ -92,14 +98,14 @@
        <a-row :gutter="24">
          <a-col :span="12">
            <a-form-model-item label="驱动类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
            <a-form-model-item label="驱动类型">
              <j-dict-select-tag :disabled="true" :readOnly="disableSubmit" placeholder="请选择驱动类型"
                                 :triggerChange="true" dictCode="mdc_driveType"
                                 v-model="model.driveType" allow-clear/>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="设备型号" :labelCol="labelCol" :wrapperCol="wrapperCol">
            <a-form-model-item label="设备型号">
              <a-input :disabled="true" :readOnly="disableSubmit" allow-clear placeholder="请输入设备型号"
                       v-model="model.equipmentModel"/>
            </a-form-model-item>
@@ -108,20 +114,28 @@
        <a-row :gutter="24">
          <a-col :span="12">
            <a-form-model-item label="系统类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
              <j-dict-select-tag  placeholder="请选择系统类型" :triggerChange="true" dictCode="system_type" v-model="model.systemType" allow-clear/>
            <a-form-model-item label="系统类型">
              <j-dict-select-tag placeholder="请选择系统类型" :triggerChange="true" dictCode="system_type"
                                 v-model="model.systemType" allow-clear/>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="设备状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
              <j-dict-select-tag  placeholder="请选择设备状态" :triggerChange="true" dictCode="mdc_equipment_status" v-model="model.equipmentStatus" allow-clear/>
            <a-form-model-item label="设备状态">
              <j-dict-select-tag placeholder="请选择设备状态" :triggerChange="true" dictCode="mdc_equipment_status"
                                 v-model="model.equipmentStatus" allow-clear/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="12" v-has="'equipment_attribute'">
            <a-form-model-item label="设备属性">
              <j-dict-select-tag v-model="model.attribute"  type="radio"
                                 dictCode="equipment_attribute"/>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="排序" :labelCol="labelCol" :wrapperCol="wrapperCol">
            <a-form-model-item label="排序">
              <a-input :disabled="disableSubmit" :readOnly="disableSubmit" placeholder="请输入排序"
                       v-model="model.sortNo" style="width: 100%"/>
            </a-form-model-item>
@@ -130,7 +144,7 @@
        <a-row :gutter="24">
          <a-col :span="24">
            <a-form-model-item :labelCol="{span:3}" :wrapperCol="{span:21}" label="备注">
            <a-form-model-item :labelCol="{span:4}" :wrapperCol="{span:19}" label="备注">
              <a-textarea :disabled="disableSubmit" :readOnly="disableSubmit" placeholder="请输入备注"
                          v-model="model.remark"/>
            </a-form-model-item>
@@ -155,18 +169,19 @@
  import pick from 'lodash.pick'
  import moment from 'moment'
  import Vue from 'vue'
  import { ACCESS_TOKEN } from "@/store/mutation-types"
  import { ACCESS_TOKEN } from '@/store/mutation-types'
  import { getAction } from '@/api/manage'
  import { addEquipment,editEquipment} from '@/api/api'
  import { disabledAuthFilter } from "@/utils/authFilter"
  import { disabledAuthFilter } from '@/utils/authFilter'
  import { duplicateCheck } from '@/api/api'
  import JSelectEquipmentProduction from '../../../../../components/jeecgbiz/JSelectEquipmentProduction'
  import JSelectProduction from '../../../../../components/jeecgbiz/JSelectProduction'
  import DeviceListModel from './DeviceListModal'
  import JSelectEquipmentDepart from '../../../../../components/jeecgbiz/JSelectEquipmentDepart'
  import {mapActions} from 'vuex'
  export default {
    name: "UserModal",
    name: 'UserModal',
    components: {
      JSelectProduction,
      JSelectEquipmentDepart,
@@ -183,10 +198,10 @@
        drawerWidth:700,
        modalToggleFlag:true,
        confirmDirty: false,
        userId:"", //保存用户id
        userId: '', //保存用户id
        // disableSubmit:false,
        disableSubmit: true,
        dateFormat:"YYYY-MM-DD",
        dateFormat: 'YYYY-MM-DD',
        form: this.$form.createForm(this),
        validatorRules:{
@@ -195,7 +210,7 @@
            [
              {
              required: true, message: '请选择设备编号!'
              },
              }
              // {
              // validator: this.validatequipmentId
              // }
@@ -211,38 +226,38 @@
        },
        departIdShow:false,
        title:"操作",
        title: '操作',
        visible: false,
        model: {
          equipmentId: "",
          equipmentName: "",
          equipmentModel: "",
          equipmentIp: "",
          dataPort: "",
          driveType: "",
          systemType: "",
          equipmentId: '',
          equipmentName: '',
          equipmentModel: '',
          equipmentIp: '',
          dataPort: '',
          driveType: '',
          systemType: '',
          equipmentStatus: '0',
          deviceLevel: "",
          deviceCategory: "",
          deviceLevel: '',
          deviceCategory: ''
        },
        labelCol: {
          xs: { span: 24 },
          sm: { span: 8 },
          sm: { span: 8 }
        },
        wrapperCol: {
          xs: { span: 24 },
          sm: { span: 15 },
          sm: { span: 14 }
        },
        uploadLoading:false,
        confirmLoading: false,
        headers:{},
        url: {
          fileUpload: window._CONFIG['domianURL']+"/sys/common/upload",
          userWithDepart: "/mdc/mdcEquipment/equipmentDepartList", // å¼•入为指定用户查看部门信息需要的url
          fileUpload: window._CONFIG['domianURL'] + '/sys/common/upload',
          userWithDepart: '/mdc/mdcEquipment/equipmentDepartList', // å¼•入为指定用户查看部门信息需要的url
          //引入为指定用户查看车间信息需要的url
          userProductionList: '/mdc/mdcEquipment/equipmentProductionList',
          userId:"/sys/user/generateUserId", // å¼•入生成添加用户情况下的url
          syncUserByUserName:"/act/process/extActProcess/doSyncUserByUserName",//同步用户到工作流
          userId: '/sys/user/generateUserId', // å¼•入生成添加用户情况下的url
          syncUserByUserName: '/act/process/extActProcess/doSyncUserByUserName',//同步用户到工作流
          queryTenantList: '/sys/tenant/queryList',
          check:'/sys/duplicate/check',
          queryEquipmentType:'/mdc/mdcEquipmentType/queryEquipmentType'
@@ -256,8 +271,8 @@
      }
    },
    created () {
      const token = Vue.ls.get(ACCESS_TOKEN);
      this.headers = {"X-Access-Token":token}
      const token = Vue.ls.get(ACCESS_TOKEN)
      this.headers = { 'X-Access-Token': token }
      this.queryGroup()
      this.queryTreeData()
      // this.initRoleList()
@@ -265,7 +280,7 @@
    },
    computed:{
      uploadAction:function () {
        return this.url.fileUpload;
        return this.url.fileUpload
      }
    },
    methods: {
@@ -279,7 +294,7 @@
            this.$notification.warning({
              message:'消息',
              description:res.message
            });
            })
          }
        }).finally(() =>{
        })
@@ -296,7 +311,7 @@
            this.$notification.warning({
              message:'消息',
              description:res.message
            });
            })
          }
        }).finally(() => {
          this.loading = false
@@ -322,18 +337,31 @@
        this.$refs.deviceListModel.disableSubmit = false
      },
      add () {
        this.refresh();
        this.edit({activitiSync:'1',userIdentity:1,equipmentId:"",equipmentName:"",equipmentModel:"",equipmentIp:'',dataPort:"",driveType:"",controlSystem:"",saveTableName:"",equipmentStatus:'0'});
        this.refresh()
        this.edit({
          activitiSync: '1',
          userIdentity: 1,
          equipmentId: '',
          equipmentName: '',
          equipmentModel: '',
          equipmentIp: '',
          dataPort: '',
          driveType: '',
          controlSystem: '',
          saveTableName: '',
          equipmentStatus: '0',
          attribute: 0
        })
      },
      edit (record) {
        let that = this;
        that.visible = true;
        let that = this
        that.visible = true
        //根据屏幕宽度自适应抽屉宽度
        this.resetScreenSize();
        this.resetScreenSize()
        // that.userId = record.id;
        // console.log(record)
        that.model = Object.assign({}, record);
        that.model = Object.assign({}, record)
        // that.model = Object.assign({},{selectedroles:'',selectedProduction:''}, record);
        // this.model = Object.assign({}, record)
@@ -341,43 +369,43 @@
          this.form.setFieldsValue(pick(that.model, 'selectedDeparts', 'selectedProduction', 'equipmentId', 'equipmentName', 'equipmentModel', 'equipmentType', 'equipmentIp', 'dataPort',
            'driveType', 'sortNo', 'remark','systemVersion','devicePower','controlSystem','saveTableName'))
        })
        if(record.hasOwnProperty("id")){
        if (record.hasOwnProperty('id')) {
          // that.getUserRoles(record.id);
          that.getUserDeparts(record.id);
          that.getUserDeparts(record.id)
        }
        // console.log('that.model=',that.model)
      },
      isDisabledAuth(code){
        return disabledAuthFilter(code);
        return disabledAuthFilter(code)
      },
      //窗口最大化切换
      toggleScreen(){
        if(this.modalToggleFlag){
          this.modalWidth = window.innerWidth;
          this.modalWidth = window.innerWidth
        }else{
          this.modalWidth = 800;
          this.modalWidth = 800
        }
        this.modalToggleFlag = !this.modalToggleFlag;
        this.modalToggleFlag = !this.modalToggleFlag
      },
      // æ ¹æ®å±å¹•变化,设置抽屉尺寸
      resetScreenSize(){
        let screenWidth = document.body.clientWidth;
        let screenWidth = document.body.clientWidth
        if(screenWidth < 500){
          this.drawerWidth = screenWidth;
          this.drawerWidth = screenWidth
        }else{
          this.drawerWidth = 700;
          this.drawerWidth = 700
        }
      },
      getUserDeparts(userid){
        let that = this;
        let that = this
        //部门的url
        getAction(that.url.userWithDepart,{equipmentId:userid}).then((res)=>{
          if(res.success){
            // console.log(res.result)
            let departOptions=[];
            let departOptions = []
            let selectDepartKeys=[]
            for (let i = 0; i < res.result.length; i++) {
              selectDepartKeys.push(res.result[i].key);
              selectDepartKeys.push(res.result[i].key)
              //新增负责部门选择下拉框
              departOptions.push({
                value: res.result[i].key,
@@ -385,10 +413,10 @@
              })
            }
            that.model.selectedDeparts = selectDepartKeys.join(",")
            that.model.selectedDeparts = selectDepartKeys.join(',')
            // that.model.selectedProduction = selectDepartKeys.join(",")
            that.nextDepartOptions=departOptions;
            that.nextDepartOptions = departOptions
            // console.log('that.nextDepartOptions=',that.nextDepartOptions)
          }
        })
@@ -396,11 +424,11 @@
        getAction(that.url.userProductionList,{equipmentId:userid}).then((res)=>{
          if(res.success){
            // console.log(res.result)
            let ProductionOptions=[];
            let ProductionOptions = []
            let selectProductKeys=[]
            // console.log(res.result)
            for (let i = 0; i < res.result.length; i++) {
              selectProductKeys.push(res.result[i].key);
              selectProductKeys.push(res.result[i].key)
              //新增负责部门选择下拉框
              ProductionOptions.push({
                value: res.result[i].key,
@@ -408,9 +436,9 @@
              })
            }
            that.model.selectedProduction = selectProductKeys.join(",")
            that.model.selectedProduction = selectProductKeys.join(',')
            that.nextProductionOptions=ProductionOptions;
            that.nextProductionOptions = ProductionOptions
            // console.log('that.nextProductionOptions=',that.nextProductionOptions)
          }
        })
@@ -418,88 +446,88 @@
      },
      backDepartInfo(info) {
        // console.log(info)
        this.model.departIds = this.model.selectedDeparts;
        this.model.departIds = this.model.selectedDeparts
        this.nextDepartOptions = info.map((item,index,arr)=>{
          let c = {label:item.text, value: item.value+""}
          return c;
          let c = { label: item.text, value: item.value + '' }
          return c
        })
      },
      backProductionInfo(info) {
        // console.log(info)
        this.model.productionIds = this.model.selectedProduction;
        this.model.productionIds = this.model.selectedProduction
        this.nextProductionOptions = info.map((item,index,arr)=>{
          let c = {label:item.text, value: item.value+""}
          return c;
          let c = { label: item.text, value: item.value + '' }
          return c
        })
      },
      refresh () {
        this.userId=""
        this.nextDepartOptions=[];
        this.nextProductionOptions = [];
        this.departIdShow=false;
        this.userId = ''
        this.nextDepartOptions = []
        this.nextProductionOptions = []
        this.departIdShow = false
      },
      close () {
        this.$emit('close');
        this.visible = false;
        this.disableSubmit = false;
        this.nextDepartOptions=[];
        this.$emit('close')
        this.visible = false
        this.disableSubmit = false
        this.nextDepartOptions = []
        this.nextProductionOptions = []
        this.departIdShow=false;
        this.departIdShow = false
        // this.$refs.form.resetFields();
      },
      moment,
      handleSubmit () {
        const that = this;
        const that = this
        // è§¦å‘表单验证
        this.$refs.form.validate(valid => {
          if (valid) {
            that.confirmLoading = true;
            that.confirmLoading = true
            //如果是上级择传入departIds,否则为空
            // if(this.model.userIdentity!==2){
            //   this.model.departIds="";
            // }
            let obj;
            let obj
            if(!this.model.id){
              this.model.id = this.userId;
              obj=addEquipment(this.model);
              this.model.id = this.userId
              obj = addEquipment(this.model)
            }else{
              obj=editEquipment(this.model,{
                        id: this.model.id
                      });
              })
            }
            obj.then((res)=>{
              if(res.success){
                that.$notification.success({
                  message:'消息',
                  description:res.message
                });
                that.$emit('ok');
                })
                that.$emit('ok')
              }else{
                that.$notification.warning({
                  message:'消息',
                  description:res.message
                });
                })
              }
            }).finally(() => {
              that.confirmLoading = false;
              that.close();
              that.confirmLoading = false
              that.close()
            })
          }else{
            return false;
            return false
          }
        })
      },
      handleConfirmBlur(e) {
        const value = e.target.value;
        const value = e.target.value
        this.confirmDirty = this.confirmDirty || !!value
      },
      identityChange(e){
        if(e.target.value===1){
          this.departIdShow=false;
          this.departIdShow = false
        }else{
          this.departIdShow=true;
          this.departIdShow = true
        }
      },
      /**
@@ -508,7 +536,7 @@
      removeValidate(){
        this.$refs.form.clearValidate()
      }
    },
    }
  }
</script>
@@ -518,6 +546,7 @@
    width:104px;
    height:104px;
  }
  .ant-upload-select-picture-card i {
    font-size: 49px;
    color: #999;
src/views/mdc/base/modules/OEEAnalysis/ComputeOeeModal.vue
@@ -1,6 +1,7 @@
<template>
  <a-modal title="计算OEE" :visible="visible" :width="550" @cancel="handleModalClose" @ok="handleComputeOee"
           :maskClosable="false">
  <j-modal title="计算OEE" :visible="visible" :width="550" @cancel="handleModalClose" @ok="handleComputeOee"
           :maskClosable="false" :confirmLoading="confirmLoading">
    <a-spin :spinning="confirmLoading">
    <a-form-model :model="model" :labelCol="labelColLong" :wrapperCol="wrapperColLong">
      <a-row>
        <a-col :span="24">
@@ -11,7 +12,8 @@
        </a-col>
      </a-row>
    </a-form-model>
  </a-modal>
    </a-spin>
  </j-modal>
</template>
<script>
@@ -23,6 +25,7 @@
    data() {
      return {
        visible: false,
        confirmLoading: false,
        model: {},
        dates: [],
        labelColLong: {
@@ -46,6 +49,7 @@
          return
        }
        this.confirmLoading = true
        mdcApi.computeOeeApi(this.model)
          .then(res => {
            if (res.success) {
@@ -53,7 +57,8 @@
                message: '消息',
                description: res.message
              })
              this.visible = false
              this.$emit('ok')
              this.handleModalClose()
            } else {
              this.$notification.error({
                message: '消息',
@@ -67,6 +72,9 @@
              description: '计算失败'
            })
          })
          .finally(() => {
            this.confirmLoading = false
          })
      },
      dateParamChange(value1, value2) {
src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue
@@ -49,7 +49,7 @@
      </a-table>
    </div>
    <ComputeOeeModal ref="computeOeeModalRef"/>
    <ComputeOeeModal ref="computeOeeModalRef" @ok="modalFormOk"/>
  </div>
</template>
src/views/mdc/base/modules/OpenRateFractionAnalysis/OpenRateFractionAnalysisMain.vue
@@ -16,8 +16,9 @@
                <a-space>
                  <a-time-picker :default-value="moment('00:00', 'HH:mm')" format="HH:mm" @change="onChangeStart" :allowClear="false"/>
                  è‡³
                  <a-time-picker :default-value="moment('08:00', 'HH:mm')" format="HH:mm" @change="onChangeEnd" :allowClear="false"/>
                  <a-time-picker :default-value="moment('23:59', 'HH:mm')" format="HH:mm" @change="onChangeEnd" :allowClear="false"/>
                  <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
                  <a-button type="primary" @click="exportExcel" icon="download">导出</a-button>
                </a-space>
              </a-form-item>
            </a-col>
@@ -28,17 +29,16 @@
        <a-spin :spinning="loading">
          <div id="Efficiency" class="container" style="margin-bottom: 15px;">
              <div class="table2">
                <table class="dataContent table" border="1" cellspacing="0" cellpadding="0"
                       style="white-space: nowrap;text-align: center;">
                <table class="dataContent table" border="1" cellspacing="0" cellpadding="0">
                  <thead>
                  <tr class="thead fixed equipname">
                    <th class="thgu dong1 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">
                    <th class="thgu dong1 name" style="min-width: 150px; max-width: 150px;width: 150px;">
                      è®¾å¤‡ç¼–号
                    </th>
                    <th class="thgu dong2 name" rowspan="2" style="min-width: 162px; max-width: 162px;width: 162px;">
                    <th class="thgu dong2 name" style="min-width: 162px; max-width: 162px;width: 162px;">
                      è®¾å¤‡åç§°
                    </th>
                    <th class="thgu dong3 name" rowspan="2" style="min-width: 100px; max-width: 100px;width: 100px;">
                    <th class="thgu dong3 name" style="min-width: 100px; max-width: 100px;width: 100px;">
                      è®¾å¤‡ç±»åž‹
                    </th>
                    <template v-for="(tableHead, index) in tableHeads">
@@ -128,7 +128,7 @@
      this.queryParam.startDate = moment(this.dates[0]).format('YYYYMMDD')
      this.queryParam.endDate = moment(this.dates[1]).format('YYYYMMDD')
      this.queryParam.startTime = '00:00'
      this.queryParam.endTime = '08:00'
      this.queryParam.endTime = '23:59'
      this.queryParam.typeTree = '1'
      this.loadData1()
@@ -183,6 +183,17 @@
    },
    methods: {
      moment,
      exportExcel() {
        $('#Efficiency').table2excel({
          exclude: '.noExl',
          name: 'Excel Document Name',
          filename: '利用率分段分析',
          exclude_img: true,
          fileext: '.xls',
          exclude_links: true,
          exclude_inputs: true
        })
      },
      onChangeStart(time, timeString) {
        this.queryParam.startTime = timeString
        // console.log(time, timeString);
src/views/mdc/base/modules/WorkshopSignage/SignageModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,242 @@
<template>
  <a-modal :title="modalTitle" :width="modalWidth" :visible="visible" :footer="null" @cancel="visible=false"
           destroyOnClose>
    <a-form layout="inline" @keyup.enter.native="loadData(1)">
      <a-form-item label="工段">
        <a-select default-value="" style="width: 200px" @select="handleSelectChange">
          <a-select-option key="">全部</a-select-option>
          <a-select-option v-for="item in selectList" :key="item.id">{{item.productionName}}</a-select-option>
        </a-select>
      </a-form-item>
      <a-form-item>
        <a-button type="primary" @click="loadData(1)">查询</a-button>
      </a-form-item>
    </a-form>
    <a-table :columns="columns" :dataSource="dataSource" :pagination="ipagination" :loading="loading"
             @change="handleTableChange" style="margin-top: 20px" rowKey="id">
      <template slot="qualifiedStatus" slot-scope="text, record">
        <span :style="{color:text==='未完成'?'#f00':'#89D961',fontWeight:'bold'}">{{text}}</span>
      </template>
    </a-table>
  </a-modal>
</template>
<script>
  import signageApi from '@/api/signage'
  import { filterObj } from '@/utils/util'
  export default {
    name: 'SignageModal',
    components: {},
    props: {
      modalWidth: {
        type: Number,
        default: 1048
      },
      modalTitle: {
        type: String
      },
      productionId: {
        type: String
      }
    },
    watch: {
      visible: {
        handler(newVal) {
          // æ‰“开弹窗时数据回到第一页且每页显示最大条数恢复为最小值
          if (newVal) {
            this.getSectionListByApi()
            this.searchReset()
            this.ipagination.pageSize = +this.ipagination.pageSizeOptions[0]
          }
        }
      }
    },
    data() {
      return {
        visible: false,
        selectList: [],
        queryParam: {},
        loading: false,
        /* åˆ†é¡µå‚æ•° */
        ipagination: {
          current: 1,
          pageSize: 10,
          pageSizeOptions: ['10', '20', '30'],
          showTotal: (total, range) => {
            return range[0] + '-' + range[1] + ' å…±' + total + '条'
          },
          showQuickJumper: true,
          showSizeChanger: true,
          total: 0
        },
        dataSource: [],
        columns: [
          {
            align: 'center',
            title: '工厂名称',
            dataIndex: 'workshop',
            key: 'workshop'
          },
          {
            align: 'center',
            title: '工段名称',
            dataIndex: 'dept',
            key: 'dept'
          },
          {
            align: 'center',
            title: '零件编号',
            dataIndex: 'mdsItemCode',
            key: 'mdsItemCode'
          },
          {
            align: 'center',
            title: '下达任务量',
            key: 'batchNum',
            dataIndex: 'batchNum'
          },
          {
            align: 'center',
            title: '完成任务量',
            key: 'qualifiedQty',
            dataIndex: 'qualifiedQty'
          },
          {
            align: 'center',
            title: '完成百分比',
            key: 'qualifiedRate',
            dataIndex: 'qualifiedRate'
          },
          {
            align: 'center',
            title: '是否完成',
            key: 'qualifiedStatus',
            dataIndex: 'qualifiedStatus',
            scopedSlots: { customRender: 'qualifiedStatus' }
          }
        ]
      }
    },
    methods: {
      // èŽ·å–è½¦é—´å¯¹åº”å·¥æ®µåˆ—è¡¨
      getSectionListByApi() {
        const that = this
        signageApi.getSectionListApi(this.productionId)
          .then(res => {
            console.log('res--------', res)
            if (res.success) that.selectList = res.result
          })
      },
      loadData(arg) {
        //加载数据 è‹¥ä¼ å…¥å‚æ•°1则加载第一页的内容
        if (arg === 1) this.ipagination.current = 1
        const params = this.getQueryParams()//查询条件
        params.productionId = this.productionId
        if (!params) return false
        this.loading = true
        signageApi.getMesProductionListApi(params)
          .then((res) => {
            if (res.success) {
              this.dataSource = res.result.records || res.result
              if (res.result.total) {
                this.ipagination.total = res.result.total
              } else {
                this.ipagination.total = 0
              }
            } else {
              this.$message.warning(res.message)
            }
          })
          .finally(() => {
            this.loading = false
          })
      },
      /**
       * å·¥æ®µé€‰æ‹©å˜åŒ–时触发
       * @param value é€‰æ‹©åŽkey
       */
      handleSelectChange(value) {
        this.queryParam.proChildId = value
      },
      getQueryParams() {
        //获取查询条件
        let sqp = {}
        const param = Object.assign(sqp, this.queryParam, this.isorter, this.filters)
        param.field = this.getQueryField()
        param.pageNo = this.ipagination.current
        param.pageSize = this.ipagination.pageSize
        return filterObj(param)
      },
      getQueryField() {
        let str = 'id,'
        this.columns.forEach(function(value) {
          str += ',' + value.dataIndex
        })
        return str
      },
      searchReset() {
        this.queryParam = {}
        this.dataSource = []
        this.loadData(1)
      },
      /**
       * åˆ†é¡µå˜åŒ–时触发
       * @param pagination åˆ†é¡µå‚æ•°
       */
      handleTableChange(pagination) {
        this.ipagination = pagination
        this.loadData()
      }
    }
  }
</script>
<style scoped>
  /deep/ .ant-modal-content, /deep/ .ant-modal-header,
  /deep/ .ant-table-placeholder, /deep/ .ant-pagination-item-active {
    background-color: #000;
  }
  /deep/ .ant-modal-title, /deep/ .ant-pagination-total-text,
  /deep/ .ant-modal-close, /deep/ .ant-form-item-label label,
  /deep/ .ant-table-placeholder .ant-empty-description, /deep/ .ant-pagination-options-quick-jumper {
    color: #fff;
  }
  /deep/ .ant-input, /deep/ .ant-pagination-item a,
  /deep/ .ant-pagination-item-link, /deep/ .ant-select-selection--single,
  /deep/ .ant-pagination-options-quick-jumper input, /deep/ .ant-select-dropdown-menu-item {
    color: #fff;
    background-color: #000;
  }
  /deep/ .ant-table-thead th {
    background-color: #5C5C5C;
    color: #fff;
  }
  /deep/ .ant-table-tbody td {
    background-color: #262626;
    color: #fff;
  }
  /deep/ .ant-table-tbody > tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected) > td {
    background: #7E7E7E;
  }
  /deep/ .ant-pagination-item-link:hover {
    color: #1890FF;
    border-color: #1890FF;
  }
  /deep/ .ant-select-dropdown-menu-item:hover:not(.ant-select-dropdown-menu-item-disabled) {
    background-color: #1890FF;
  }
</style>
src/views/mdc/base/modules/WorkshopSignage/WorkshopDeviceOverview.vue
@@ -1,6 +1,20 @@
<template>
  <div style="flex:1;display: flex;">
    <div class="chart-container" :id="chartContainerId"></div>
    <!--<div style="height: 100%">-->
    <!--<div class="chart-container" :id="chartContainerId"></div>-->
    <!--</div>-->
    <div style="flex: 1;display: flex;flex-direction: column">
      <div class="chart-container" :id="chartContainerId" style="flex: 1"></div>
      <div class="pie-value-container">
        <div>
          <span class="color-square" style="background-color: #00923f"></span>完成量 {{equipmentStatusCountObj.qualifiedQty}}
        </div>
        <div>
          <span class="color-square" style="background-color: #e67817"></span>任务量 {{equipmentStatusCountObj.planQty}}
        </div>
      </div>
    </div>
    <div class="equipment-state-container">
      <div>设备总数:{{equipmentStatusCountObj.equipmentCount}}台</div>
      <div>大修、项修数量:{{equipmentStatusCountObj.repairCount}}台</div>
@@ -18,16 +32,22 @@
      </div>
    </div>
    <SignageModal ref="signageModalRef" :modalTitle="modalTitle" :productionId="currentProductionId"/>
  </div>
</template>
<script>
  import signageApi from '@/api/signage'
  import SignageModal from './SignageModal'
  export default {
    name: 'WorkshopDeviceOverview',
    components: {},
    components: { SignageModal },
    props: {
      workshopName: {
        type: String
      },
      currentProductionId: {
        type: String
      },
@@ -42,7 +62,8 @@
      return {
        chartContainer: null,
        chartContainerId: 'left-col-chart1',
        equipmentStatusCountObj: {}
        equipmentStatusCountObj: {},
        modalTitle: ''
      }
    },
    mounted() {
@@ -81,7 +102,7 @@
            {
              name: '类目',
              type: 'pie',
              radius: '60%',
              radius: '90%',
              center: ['50%', '50%'],
              hoverAnimation: false,
              data: [
@@ -124,6 +145,12 @@
        }
        option.series[0].data[0].value = yAxisData1
        option.series[0].data[1].value = yAxisData2
        this.chartContainer.on('click', () => {
          this.modalTitle = this.workshopName + '当月任务完成百分比'
          this.$refs.signageModalRef.visible = true
        })
        this.chartContainer.setOption(option, true)
      },
@@ -155,6 +182,22 @@
</script>
<style lang="less">
  .pie-value-container {
    > div {
      text-align: center;
      margin-bottom: 5px;
    }
    .color-square {
      display: inline-block;
      width: 0.625vw;
      height: 0.45vw;
      border-radius: 0.1vw;
      background-color: #00ff80;
      margin-right: 0.4vw;
    }
  }
  .equipment-state-container {
    display: flex;
    flex-direction: column;
src/views/mdc/base/modules/efficiencyReport/EfficiencyList.vue
@@ -44,6 +44,11 @@
                                  v-model="dates" :allowClear="false"/>
                </a-form-item>
              </a-col>
              <a-col :md="6" :sm="6">
                <a-form-item label="设备属性">
                  <j-dict-select-tag v-model="queryParam.attribute"  type="radio" dictCode="equipment_attribute"/>
                </a-form-item>
              </a-col>
            </a-row>
            <a-row :gutter="24" type="flex" align="middle">
src/views/system/UserList.vue
@@ -7,33 +7,16 @@
        <a-row :gutter="24">
          <a-col :md="6" :sm="12">
            <a-form-item label="账号">
            <a-form-item label="用户账号">
              <!--<a-input placeholder="请输入账号查询" v-model="queryParam.username"></a-input>-->
              <j-input placeholder="输入账号模糊查询" v-model="queryParam.username"></j-input>
            </a-form-item>
          </a-col>
          <a-col :md="6" :sm="8">
            <a-form-item label="性别">
              <a-select v-model="queryParam.sex" placeholder="请选择性别">
                <a-select-option value="">请选择</a-select-option>
                <a-select-option value="1">男</a-select-option>
                <a-select-option value="2">女</a-select-option>
              </a-select>
            </a-form-item>
          </a-col>
          <template v-if="toggleSearchStatus">
            <a-col :md="6" :sm="8">
              <a-form-item label="真实名字">
                <a-input placeholder="请输入真实名字" v-model="queryParam.realname"></a-input>
              </a-form-item>
            </a-col>
            <a-col :md="6" :sm="8">
              <a-form-item label="手机号码">
                <a-input placeholder="请输入手机号码查询" v-model="queryParam.phone"></a-input>
            <a-form-item label="用户姓名">
              <a-input placeholder="请输入用户姓名" v-model="queryParam.realname"></a-input>
              </a-form-item>
            </a-col>
@@ -46,16 +29,11 @@
                </a-select>
              </a-form-item>
            </a-col>
          </template>
          <a-col :md="6" :sm="8">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
              <a @click="handleToggleSearch" style="margin-left: 8px">
                {{ toggleSearchStatus ? '收起' : '展开' }}
                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
              </a>
            </span>
          </a-col>
src/views/system/modules/UserModal.vue
@@ -82,6 +82,7 @@
          <a-input
            placeholder="请输入用户姓名"
            v-model="model.realname"
            :readOnly="disableSubmit"
          />
        </a-form-model-item>
@@ -94,6 +95,7 @@
          <a-input
            placeholder="请输入工号"
            v-model="model.workNo"
            :readOnly="disableSubmit"
          />
        </a-form-model-item>
@@ -145,6 +147,7 @@
            v-model="model.selectedProduction"
            :multi="true"
            @back="backProductionInfo"
            :disabled="disableSubmit"
            :backProduction="true"
            :treeProductOpera="true"
          ></j-select-production>
@@ -215,7 +218,7 @@
            <!--placeholder="请维护中心"-->
          <!--&gt;-->
          <!--</j-multi-select-tag>-->
        </a-form-model-item>
        <!--</a-form-model-item>-->
        <!--<a-form-model-item-->
          <!--label="负责部门"-->
          <!--:labelCol="labelCol"-->