cuilei
2025-08-07 ba77fdc6a30c9ad0941e40319f8c4f6fe6fdf9f1
Merge remote-tracking branch 'origin/master'
已添加5个文件
已修改16个文件
2831 ■■■■■ 文件已修改
src/components/jeecgbiz/JSelectEquipmentFactory.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/jeecgbiz/JSelectFactory.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/jeecgbiz/modal/JSelectEquipmentFactoryModal.vue 348 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/index.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/factory.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/mutation-types.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/EquipmentList.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/EquipmentList/EquipmentModal.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/EquipmentList/UserModal.vue 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/common/BaseTree.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/MesProductionOrderList.vue 185 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/modules/MesProductionOrderForm.vue 351 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/modules/MesProductionOrderModal.vue 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/pms/PmsMaterialProcessList.vue 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/pms/PmsProcessBillMaterialsList.vue 310 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/pms/modules/PmsMaterialProcessForm.vue 186 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/pms/modules/PmsProcessBillMaterialsForm.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/pms/modules/PmsProcessBillMaterialsModal.vue 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/SysApiLogList.vue 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/modules/SysApiLogModal.vue 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/modules/UserModal.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/jeecgbiz/JSelectEquipmentFactory.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,183 @@
<template>
  <div class="components-input-demo-presuffix">
    <!---->
    <a-input @click="openModal" placeholder="请点击选择车间" v-model="textVals" readOnly :disabled="disabled">
      <a-icon slot="prefix" type="cluster" title="车间选择控件"/>
      <a-icon v-if="storeVals&&!disabled" slot="suffix" type="close-circle" @click="handleEmpty" title="清空"/>
    </a-input>
    <j-select-equipment-factory-modal
      ref="innerDepartSelectModal"
      :modal-width="modalWidth"
      :multi="multi"
      :rootOpened="rootOpened"
      :factory-id="value"
      :store="storeField"
      :text="textField"
      :treeProductOpera="treeProductOpera"
      @ok="handleOK"
      @initComp="initComp">
    </j-select-equipment-factory-modal>
  </div>
</template>
<script>
  import JSelectEquipmentFactoryModal from './modal/JSelectEquipmentFactoryModal'
  import { underLinetoHump } from '@comp/_util/StringUtil'
  export default {
    name: 'JSelectEquipmentFactory',
    components:{
      JSelectEquipmentFactoryModal,
    },
    props:{
      modalWidth:{
        type:Number,
        default:500,
        required:false
      },
      multi:{
        type:Boolean,
        default:false,
        required:false
      },
      rootOpened:{
        type:Boolean,
        default:true,
        required:false
      },
      value:{
        type:String,
        required:false
      },
      disabled:{
        type: Boolean,
        required: false,
        default: false
      },
      // è‡ªå®šä¹‰è¿”回字段,默认返回 id
      customReturnField: {
        type: String,
        default: ''
      },
      backFactory: {
        type: Boolean,
        default: false,
        required: false
      },
      // å­˜å‚¨å­—段 [key field]
      store: {
        type: String,
        default: 'id',
        required: false
      },
      // æ˜¾ç¤ºå­—段 [label field]
      text: {
        type: String,
        default: 'factoryName',
        required: false
      },
      treeProductOpera: {
        type: Boolean,
        default: false,
        required: false
      }
    },
    data(){
      return {
        visible:false,
        confirmLoading:false,
        storeVals: '', //[key values]
        textVals: '' //[label values]
      }
    },
    computed:{
      storeField(){
        let field = this.customReturnField
        if(!field){
          field = this.store;
        }
        return underLinetoHump(field)
      },
      textField(){
        return underLinetoHump(this.text)
      }
    },
    mounted(){
      this.storeVals = this.value
    },
    watch:{
      value(val){
        this.storeVals = val
      }
    },
    methods:{
      initComp(textVals){
        this.textVals = textVals
      },
      //返回选中的车间信息
      backProductInfo(){
        if(this.backFactory===true){
          //LOWCOD-2147 ã€ç”¨æˆ·ç®¡ç†ã€‘选择部门和上级以后,负责部门没有数据可选 (陶炎改造自定义返回字段导致)
          if(this.storeVals && this.storeVals.length>0){
            let arr1 = this.storeVals.split(',')
            let arr2 = this.textVals.split(',')
            let info = []
            for(let i=0;i<arr1.length;i++){
              info.push({
                value: arr1[i],
                text: arr2[i]
              })
            }
            this.$emit('back', info)
          }
        }
      },
      openModal(){
        this.$refs.innerDepartSelectModal.show()
      },
      handleOK(rows) {
        if (!rows && rows.length <= 0) {
          this.textVals = ''
          this.storeVals = ''
        } else {
          let arr1 = []
          let arr2 = []
          for(let dep of rows){
            arr1.push(dep[this.storeField])
            arr2.push(dep[this.textField])
          }
          this.storeVals = arr1.join(',')
          this.textVals = arr2.join(',')
        }
        this.$emit("change", this.storeVals)
        this.backProductInfo()
      },
      getDepartNames(){
        return this.departNames
      },
      handleEmpty(){
        this.handleOK('')
      }
    },
    model: {
      prop: 'value',
      event: 'change'
    }
  }
</script>
<style scoped>
  .components-input-demo-presuffix .anticon-close-circle {
    cursor: pointer;
    color: #ccc;
    transition: color 0.3s;
    font-size: 12px;
  }
  .components-input-demo-presuffix .anticon-close-circle:hover {
    color: #f5222d;
  }
  .components-input-demo-presuffix .anticon-close-circle:active {
    color: #666;
  }
</style>
src/components/jeecgbiz/JSelectFactory.vue
@@ -59,7 +59,7 @@
        type: String,
        default: ''
      },
      backProduction: {
      backFactory: {
        type: Boolean,
        default: false,
        required: false
@@ -116,8 +116,8 @@
        this.textVals = textVals
      },
      //返回选中的车间信息
      backProductInfo(){
        if(this.backProduction===true){
      backFactoryInfo(){
        if(this.backFactory===true){
          if(this.storeVals && this.storeVals.length>0){
            let arr1 = this.storeVals.split(',')
            let arr2 = this.textVals.split(',')
@@ -150,9 +150,9 @@
          this.textVals = arr2.join(',')
        }
        this.$emit("change", this.storeVals)
        this.backProductInfo()
        this.backFactoryInfo()
      },
      handleEmpty(){
        this.handleOK('')
      }
src/components/jeecgbiz/modal/JSelectEquipmentFactoryModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,348 @@
<template>
  <j-modal
    title="选择车间"
    :width="modalWidth"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel"
    @update:fullscreen="isFullscreen"
    wrapClassName="j-factory-select-modal"
    switchFullscreen
    cancelText="关闭">
    <a-spin tip="Loading..." :spinning="false">
      <a-input-search style="margin-bottom: 1px" placeholder="请输入车间名称按回车进行搜索" @search="onSearch" />
      <a-tree
        checkable
        :class="treeScreenClass"
        :treeData="treeData"
        :checkStrictly="checkStrictly"
        @check="onCheck"
        @select="onSelect"
        @expand="onExpand"
        :autoExpandParent="autoExpandParent"
        :expandedKeys="expandedKeys"
        :checkedKeys="checkedKeys">
        <template slot="title" slot-scope="{title}">
          <span v-if="title.indexOf(searchValue) > -1">
            {{title.substr(0, title.indexOf(searchValue))}}
            <span style="color: #f50">{{searchValue}}</span>
            {{title.substr(title.indexOf(searchValue) + searchValue.length)}}
          </span>
          <span v-else>{{title}}</span>
        </template>
      </a-tree>
    </a-spin>
    <!--底部父子关联操作和确认取消按钮-->
    <!--<template slot="footer">-->
    <!--<div class="drawer-bootom-button">-->
    <!--<a-dropdown style="float: left" :trigger="['click']" placement="topCenter">-->
    <!--<a-menu slot="overlay">-->
    <!--<a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>-->
    <!--<a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>-->
    <!--</a-menu>-->
    <!--<a-button>-->
    <!--树操作 <a-icon type="up" />-->
    <!--</a-button>-->
    <!--</a-dropdown>-->
    <!--<a-button @click="handleCancel" type="primary" style="margin-right: 0.8rem">关闭</a-button>-->
    <!--<a-button @click="handleSubmit" type="primary" >确认</a-button>-->
    <!--</div>-->
    <!--</template>-->
  </j-modal>
</template>
<script>
  import { queryFactoryTreeList } from '@/api/api'
  import { getAction } from '@/api/manage'
  export default {
    name: 'JSelectEquipmentFactoryModal',
    props:['modalWidth','multi','rootOpened','factoryId', 'store', 'text','treeOpera'],
    data(){
      return {
        visible:false,
        confirmLoading:false,
        treeData:[],
        autoExpandParent:true,
        expandedKeys:[],
        dataList:[],
        checkedKeys:[],
        checkedRows:[],
        searchValue:"",
        checkStrictly: true,
        fullscreen:false,
        allTreeKeys:[],
        url:{
          queryTreeIdList:'/base/factory/queryTreeIdList'
        }
      }
    },
    created(){
      this.loadFactoryTree();
    },
    watch:{
      factoryId(){
        this.initDepartComponent()
      },
      visible: {
        handler() {
          this.initDepartComponent(true)
        }
      }
    },
    computed:{
      treeScreenClass() {
        return {
          'my-dept-select-tree': true,
          'fullscreen': this.fullscreen,
        }
      },
    },
    methods:{
      loadFactoryTree(){
        getAction(this.url.queryTreeIdList).then(res => {
          if (res.success) {
            this.allTreeKeys = res.result
            this.loadDepart()
          } else {
            // this.$message.warning(res.message)
            this.$notification.warning({
              message:'消息',
              description:res.message
            });
          }
        }).finally(() => {
          this.loading = false
        })
      },
      matterTree(data) {
        for (var i = 0; i < data.length; i++) {
          if(data[i].leaf == false){
            data[i].disabled = true
          }
          // // è¿™é‡Œé¢å°±æ˜¯ä½ å¤„理数据的地方
          // data[i].width = '200'
          if (data[i].children && data[i].children.length > 0) {
            // children若不为空数组,则继续 é€’归调用 æœ¬æ–¹æ³•
            this.matterTree(data[i].children)
          }
        }
        return data
      },
      show(){
        this.visible=true
        this.checkedRows=[]
        this.checkedKeys=[]
      },
      loadDepart(){
        // è¿™ä¸ªæ–¹æ³•是找到所有的部门信息
        queryFactoryTreeList().then(res=>{
          if(res.success){
            let arr = [...res.result]
            this.reWriterWithSlot(arr)
            this.treeData = arr
            this.initDepartComponent()
            if(this.rootOpened){
              this.initExpandedKeys(res.result)
            }
            this.matterTree(this.treeData)
            this.expandedKeys = this.allTreeKeys
          }
        })
      },
      initDepartComponent(flag){
        let arr = []
        //该方法两个地方用 1.visible改变事件重新设置选中项 2.组件编辑页面回显
        let fieldName = flag==true?'key':this.text
        if(this.factoryId){
          let arr2 = this.factoryId.split(',')
          for(let item of this.dataList){
            if(arr2.indexOf(item[this.store])>=0){
              arr.push(item[fieldName])
            }
          }
        }
        if(flag==true){
          this.checkedKeys = [...arr]
        }else{
          this.$emit("initComp", arr.join(','))
        }
      },
      reWriterWithSlot(arr){
        for(let item of arr){
          if(item.children && item.children.length>0){
            this.reWriterWithSlot(item.children)
            let temp = Object.assign({},item)
            temp.children = {}
            this.dataList.push(temp)
          }else{
            this.dataList.push(item)
            item.scopedSlots={ title: 'title' }
          }
        }
      },
      initExpandedKeys(arr){
        if(arr && arr.length>0){
          let keys = []
          for(let item of arr){
            if(item.children && item.children.length>0){
              keys.push(item.id)
            }
          }
          this.expandedKeys=[...keys]
          //全部keys
          //this.allTreeKeys = [...keys]
        }else{
          this.expandedKeys=[]
          //this.allTreeKeys = []
        }
      },
      onCheck (checkedKeys,info) {
        if(!this.multi){
          let arr = checkedKeys.checked.filter(item => this.checkedKeys.indexOf(item) < 0)
          this.checkedKeys = [...arr]
          this.checkedRows = (this.checkedKeys.length === 0) ? [] : [info.node.dataRef]
        }else{
          if(this.checkStrictly){
            this.checkedKeys = checkedKeys.checked
          }else{
            this.checkedKeys = checkedKeys
          }
          this.checkedRows = this.getCheckedRows(this.checkedKeys)
        }
      },
      onSelect(selectedKeys,info) {
        //取消关联的情况下才走onSelect的逻辑
        if(this.checkStrictly){
          let keys = []
          keys.push(selectedKeys[0])
          if(!this.checkedKeys || this.checkedKeys.length===0 || !this.multi){
            this.checkedKeys = [...keys]
            this.checkedRows=[info.node.dataRef]
          }else{
            let currKey = info.node.dataRef.key
            if(this.checkedKeys.indexOf(currKey)>=0){
              this.checkedKeys = this.checkedKeys.filter(item=> item !==currKey)
            }else{
              this.checkedKeys.push(...keys)
            }
          }
          this.checkedRows = this.getCheckedRows(this.checkedKeys)
        }
      },
      onExpand (expandedKeys) {
        this.expandedKeys = expandedKeys
        this.autoExpandParent = false
      },
      handleSubmit(){
        if(!this.checkedKeys || this.checkedKeys.length==0){
          this.$emit("ok",'')
        }else{
          let checkRow = this.getCheckedRows(this.checkedKeys)
          let keyStr = this.checkedKeys.join(",")
          this.$emit("ok", checkRow, keyStr)
        }
        this.handleClear()
      },
      handleCancel(){
        this.handleClear()
      },
      handleClear(){
        this.visible=false
        this.checkedKeys=[]
      },
      getParentKey(currKey,treeData){
        let parentKey
        for (let i = 0; i < treeData.length; i++) {
          const node = treeData[i]
          if (node.children) {
            if (node.children.some(item => item.key === currKey)) {
              parentKey = node.key
            } else if (this.getParentKey(currKey, node.children)) {
              parentKey = this.getParentKey(currKey, node.children)
            }
          }
        }
        return parentKey
      },
      onSearch(value){
        const expandedKeys = this.dataList.map((item) => {
          if (item.title.indexOf(value) > -1) {
            return this.getParentKey(item.key,this.treeData)
          }
          return null
        }).filter((item, i, self) => item && self.indexOf(item) === i)
        Object.assign(this, {
          expandedKeys,
          searchValue: value,
          autoExpandParent: true,
        })
      },
      // æ ¹æ® checkedKeys èŽ·å– rows
      getCheckedRows(checkedKeys) {
        const forChildren = (list, key) => {
          for (let item of list) {
            if (item.id === key) {
              return item
            }
            if (item.children instanceof Array) {
              let value = forChildren(item.children, key)
              if (value != null) {
                return value
              }
            }
          }
          return null
        }
        let rows = []
        for (let key of checkedKeys) {
          let row = forChildren(this.treeData, key)
          if (row != null) {
            rows.push(row)
          }
        }
        return rows
      },
      switchCheckStrictly (v) {
        if(v==1){
          this.checkStrictly = false
        }else if(v==2){
          this.checkStrictly = true
        }
      },
      isFullscreen(val){
        this.fullscreen=val
      }
    }
  }
</script>
<style lang="less" scoped>
  // é™åˆ¶éƒ¨é—¨é€‰æ‹©æ ‘高度,避免部门太多时点击确定不便
  .my-dept-select-tree{
    height:350px;
    &.fullscreen{
      height: calc(100vh - 250px);
    }
    overflow-y: scroll;
  }
  .drawer-bootom-button {
    position: absolute;
    bottom: 0;
    width: 100%;
    border-top: 1px solid #e8e8e8;
    padding: 10px 16px;
    text-align: right;
    left: 0;
    background: #fff;
    border-radius: 0 0 2px 2px;
  }
</style>
src/store/index.js
@@ -11,6 +11,7 @@
import Production from './modules/Production'
//部门树权限
import DepartTree from './modules/DepartTree'
import factory from './modules/factory'
Vue.use(Vuex)
@@ -22,6 +23,7 @@
    enhance,
    online,
    Production,
    factory,
    DepartTree
  },
  state: {
src/store/modules/factory.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
import Vue from 'vue'
import { SET_FACTORY } from "@/store/mutation-types"
import { getAction } from '@/api/manage'
const Factory = {
  state: {
    token: '',
    //产线树
    FactoryTree:[]
  },
  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
    },
    SET_FACTORY:(state,FactoryTree) => {
      state.FactoryTree = FactoryTree
    }
  },
  actions: {
    // äº§çº¿æ ‘
      QueryFactory({ commit }) {
      return new Promise((resolve, reject) => {
        getAction("/mdc/mdcEquipment/queryTreeListByFactory").then(response => {
          if(response.success){
            const result = response.result
            Vue.ls.set(SET_FACTORY, result)
            commit('SET_FACTORY', result)
            resolve(response)
          }else{
            resolve(response)
          }
        }).catch(error => {
          reject(error)
        })
      })
    },
  }
}
export default Factory
src/store/mutation-types.js
@@ -30,4 +30,6 @@
//产线树
export const SYS_PRODUCTION = 'SYS_PRODUCTION'
//部门树权限
export const  SYS_DEPARTTREE = 'SYS_DEPARTTREE'
export const  SYS_DEPARTTREE = 'SYS_DEPARTTREE'
export const SET_FACTORY = 'SET_FACTORY'
src/views/mdc/base/EquipmentList.vue
@@ -107,7 +107,7 @@
<script>
  import UserModal from './modules/EquipmentList/UserModal'
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  import { queryProductionTreeListByMdc } from '@/api/api'
  import { queryFactoryTreeList } from '@/api/api'
  import { mapActions } from 'vuex'
  export default {
@@ -256,12 +256,12 @@
                  width: 200
                  // sorter: true
                },
                {
                  title: '安装位置',
                  align: 'center',
                  width: 200,
                  dataIndex: 'equipmentAddress'
                },
                // {
                //   title: '安装位置',
                //   align: 'center',
                //   width: 200,
                //   dataIndex: 'equipmentAddress'
                // },
                {
                  title: '车间',
                  align: 'center',
@@ -406,7 +406,7 @@
       * è°ƒç”¨æŽ¥å£èŽ·å–æŸ¥è¯¢åŒºåŸŸè½¦é—´æ ‘åˆ—è¡¨
       */
      getWorkshopListByApi() {
        queryProductionTreeListByMdc().then(res => {
        queryFactoryTreeList().then(res => {
          if (res.success) {
            this.workshopTreeData = res.result
            this.treeDefaultExpandedKeys = [...res.result].map(item => item.key)
src/views/mdc/base/modules/EquipmentList/EquipmentModal.vue
@@ -64,7 +64,7 @@
        <!--车间分配-->
        <a-form-model-item label="车间分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!productionDisabled">
          <j-select-production  v-model="model.selectedProduction" :multi="true" @back="backProductionInfo" :backProduction="true" :treeProductOpera="true"></j-select-production>
          <j-select-production  v-model="model.selectedFactory" :multi="true" @back="backProductionInfo" :backProduction="true" :treeProductOpera="true"></j-select-production>
        </a-form-model-item>
        <a-form-model-item label="负责部门" :labelCol="labelCol" :wrapperCol="wrapperCol"  v-if="departIdShow==true">
@@ -220,7 +220,7 @@
        this.resetScreenSize();
        that.userId = record.id;
        that.model = Object.assign({},{selectedroles:'',selecteddeparts:''}, record);
        that.model = Object.assign({},{selectedroles:'',selectedProduction:''}, record);
        that.model = Object.assign({},{selectedroles:'',selectedFactory:''}, record);
        //身份为上级显示负责部门,否则不显示
        if(this.model.userIdentity==2){
@@ -305,7 +305,7 @@
            }
            that.model.selecteddeparts = selectDepartKeys.join(",")
            that.model.selectedProduction = selectDepartKeys.join(",")
            that.model.selectedFactory = selectDepartKeys.join(",")
            that.nextDepartOptions=departOptions;
            console.log('that.nextDepartOptions=',that.nextDepartOptions)
@@ -325,7 +325,7 @@
              })
            }
            that.model.selectedProduction = selectProductKeys.join(",")
            that.model.selectedFactory = selectProductKeys.join(",")
            that.nextProductionOptions=ProductionOptions;
            console.log('that.nextProductionOptions=',that.nextProductionOptions)
@@ -341,7 +341,7 @@
        })
      },
      backProductionInfo(info) {
        this.model.productionIds = this.model.selectedProduction;
        this.model.productionIds = this.model.selectedFactory;
        this.nextProductionOptions = info.map((item,index,arr)=>{
          let c = {label:item.text, value: item.value+""}
          return c;
src/views/mdc/base/modules/EquipmentList/UserModal.vue
@@ -57,12 +57,12 @@
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="车间分配" v-show="!productionDisabled"
                               ref="selectedProduction" prop="selectedProduction">
            <a-form-model-item label="车间分配" v-show="!factoryDisabled"
                               ref="selectedFactory" prop="selectedFactory">
              <!--<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-factory :disabled="disableSubmit" v-model="model.selectedFactory" :multi="false"
                                             @back="backFactoryInfo" :backFactory="true"
                                             :treeProductOpera="true"></j-select-equipment-factory>
            </a-form-model-item>
          </a-col>
@@ -124,13 +124,13 @@
        </a-row>
        <a-row :gutter="24">
          <a-col :span="12">
            <a-form-model-item label="系统类型">
              <j-dict-select-tag placeholder="请选择系统类型" :triggerChange="true" dictCode="system_type"
                                 :disabled="disableSubmit"
                                 v-model="model.systemType" allow-clear/>
            </a-form-model-item>
          </a-col>
<!--          <a-col :span="12">-->
<!--            <a-form-model-item label="系统类型">-->
<!--              <j-dict-select-tag placeholder="请选择系统类型" :triggerChange="true" dictCode="system_type"-->
<!--                                 :disabled="true"-->
<!--                                 v-model="model.systemType" allow-clear/>-->
<!--            </a-form-model-item>-->
<!--          </a-col>-->
          <a-col :span="12">
            <a-form-model-item label="排序">
              <a-input :disabled="disableSubmit" :readOnly="disableSubmit" placeholder="请输入排序"
@@ -139,22 +139,22 @@
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span='12' v-if="systemType">
            <a-form-model-item label="系统类型">
              <a-radio-group name="radioGroup" v-model="systemValue" :disabled="disableSubmit">
                <a-radio value="1">DNC</a-radio>
                <a-radio value="2">MDC</a-radio>
                <a-radio value="3">通用</a-radio>
              </a-radio-group>
            </a-form-model-item>
          </a-col>
          <a-col :span='12'>
            <a-form-model-item label="安装位置">
              <a-input v-model="model.equipmentAddress" allow-clear placeholder="请输入安装位置" :disabled="disableSubmit"/>
            </a-form-model-item>
          </a-col>
        </a-row>
<!--        <a-row :gutter="24">-->
<!--          <a-col :span='12' v-if="systemType">-->
<!--            <a-form-model-item label="系统类型">-->
<!--              <a-radio-group name="radioGroup" v-model="systemValue" :disabled="disableSubmit">-->
<!--                <a-radio value="1">DNC</a-radio>-->
<!--                <a-radio value="2">MDC</a-radio>-->
<!--                <a-radio value="3">通用</a-radio>-->
<!--              </a-radio-group>-->
<!--            </a-form-model-item>-->
<!--          </a-col>-->
<!--          <a-col :span='12'>-->
<!--            <a-form-model-item label="安装位置">-->
<!--              <a-input v-model="model.equipmentAddress" allow-clear placeholder="请输入安装位置" :disabled="disableSubmit"/>-->
<!--            </a-form-model-item>-->
<!--          </a-col>-->
<!--        </a-row>-->
        <a-row :gutter="24">
@@ -198,8 +198,8 @@
  import { addEquipment, editEquipment } from '@/api/api'
  import { disabledAuthFilter } from '@/utils/authFilter'
  import { duplicateCheck } from '@/api/api'
  import JSelectEquipmentProduction from '../../../../../components/jeecgbiz/JSelectEquipmentProduction'
  import JSelectProduction from '../../../../../components/jeecgbiz/JSelectProduction'
  import JSelectEquipmentFactory from '../../../../../components/jeecgbiz/JSelectEquipmentFactory'
  import JSelectFactory from '../../../../../components/jeecgbiz/JSelectFactory'
  import DeviceListModel from './DeviceListModal'
  import JSelectEquipmentDepart from '../../../../../components/jeecgbiz/JSelectEquipmentDepart'
  import { mapActions } from 'vuex'
@@ -207,15 +207,15 @@
  export default {
    name: 'UserModal',
    components: {
      JSelectProduction,
      JSelectFactory,
      JSelectEquipmentDepart,
      JSelectEquipmentProduction,
      JSelectEquipmentFactory,
      DeviceListModel
    },
    data() {
      return {
        departDisabled: false, //是否是我的部门调用该页面
        productionDisabled: false, //是否是我的车间调用该页面
        factoryDisabled: false, //是否是我的车间调用该页面
        roleDisabled: false, //是否是角色维护调用该页面
        modalWidth: 800,
        drawerWidth: 700,
@@ -240,7 +240,7 @@
            ],
          // trigger: 'blur' // è§¦å‘方式
          selectedProduction:
          selectedFactory:
            [
              {
                required: true, message: '请选择车间!'
@@ -289,7 +289,7 @@
          fileUpload: window._CONFIG['domianURL'] + '/sys/common/upload',
          userWithDepart: '/mdc/mdcEquipment/equipmentDepartList', // å¼•入为指定用户查看部门信息需要的url
          //引入为指定用户查看车间信息需要的url
          userProductionList: '/mdc/mdcEquipment/equipmentProductionList',
          equipmentFactoryList: '/mdc/mdcEquipment/equipmentFactoryList',
          userId: '/sys/user/generateUserId', // å¼•入生成添加用户情况下的url
          syncUserByUserName: '/act/process/extActProcess/doSyncUserByUserName',//同步用户到工作流
          queryTenantList: '/sys/tenant/queryList',
@@ -309,7 +309,7 @@
      this.headers = { 'X-Access-Token': token }
      this.queryGroup()
      this.queryTreeData()
      this.getAppPlatformName()
      // this.getAppPlatformName()
      // this.initRoleList()
      // this.initTenantList()
    },
@@ -334,13 +334,13 @@
        }).finally(() => {
        })
      },
      getAppPlatformName() {
        getAction(`/system/sysParams/query/by/settingKey?settingKey=system_type`).then(res => {
          if (res.success) {
            this.systemType = res.result.settingValue === '0'
          }
        })
      },
      // getAppPlatformName() {
      //   getAction(`/system/sysParams/query/by/settingKey?settingKey=system_type`).then(res => {
      //     if (res.success) {
      //       this.systemType = res.result.settingValue === '0'
      //     }
      //   })
      // },
      queryGroup() {
        getAction(this.url.queryEquipmentType).then(res => {
          if (res.success) {
@@ -412,7 +412,7 @@
        // this.model = Object.assign({}, record)
        this.$nextTick(() => {
          this.form.setFieldsValue(pick(that.model, 'selectedDeparts', 'selectedProduction', 'equipmentId', 'equipmentName', 'equipmentModel', 'equipmentType', 'equipmentIp', 'dataPort',
          this.form.setFieldsValue(pick(that.model, 'selectedDeparts', 'selectedFactory', 'equipmentId', 'equipmentName', 'equipmentModel', 'equipmentType', 'equipmentIp', 'dataPort',
            'driveType', 'sortNo', 'remark', 'systemVersion', 'devicePower', 'controlSystem', 'saveTableName', 'systemValue', 'equipmentAddress'))
        })
        if (record.hasOwnProperty('id')) {
@@ -467,24 +467,24 @@
          }
        })
        getAction(that.url.userProductionList, { equipmentId: userid }).then((res) => {
        getAction(that.url.equipmentFactoryList, { equipmentId: userid }).then((res) => {
          if (res.success) {
            // console.log(res.result)
            let ProductionOptions = []
            let factoryOptions = []
            let selectProductKeys = []
            // console.log(res.result)
            for (let i = 0; i < res.result.length; i++) {
              selectProductKeys.push(res.result[i].key)
              //新增负责部门选择下拉框
              ProductionOptions.push({
              factoryOptions.push({
                value: res.result[i].key,
                label: res.result[i].title
              })
            }
            that.model.selectedProduction = selectProductKeys.join(',')
            that.model.selectedFactory = selectProductKeys.join(',')
            that.nextProductionOptions = ProductionOptions
            that.nextProductionOptions = factoryOptions
            // console.log('that.nextProductionOptions=',that.nextProductionOptions)
          }
        })
@@ -498,9 +498,9 @@
          return c
        })
      },
      backProductionInfo(info) {
      backFactoryInfo(info) {
        // console.log(info)
        this.model.productionIds = this.model.selectedProduction
        this.model.productionIds = this.model.selectedFactory
        this.nextProductionOptions = info.map((item, index, arr) => {
          let c = { label: item.text, value: item.value + '' }
          return c
src/views/mdc/common/BaseTree.vue
@@ -115,7 +115,7 @@
    }
    ,
    methods: {
      ...mapActions(['QueryProduction']),
      ...mapActions(['QueryFactory']),
      getCurrSelectedTitle() {
        return !this.currSelected.title ? '' : this.currSelected.title
      },
@@ -149,7 +149,7 @@
      queryTreeData() {
        this.loading = true
        this.cardLoading = true
        this.QueryProduction().then(res => {
        this.QueryFactory().then(res => {
          if (res.success) {
            this.dataList = []
            this.allTreeKeys = []
src/views/mes/MesProductionOrderList.vue
@@ -11,7 +11,7 @@
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="订单类型">
              <j-dict-select-tag dictCode="orderCategory" placeholder="请输入订单类型"
              <j-dict-select-tag dictCode="production_order_category" placeholder="请选择订单类型"
                                 v-model="queryParam.orderCategory"></j-dict-select-tag>
            </a-form-item>
          </a-col>
@@ -27,67 +27,20 @@
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="订单状态">
              <j-dict-select-tag dictCode="order_status" placeholder="请输入订单状态"
                                 v-model="queryParam.order_status"></j-dict-select-tag>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="计划工艺路线">
              <j-input placeholder="请输入计划工艺路线" v-model="queryParam.processRoute"></j-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="计划物料清单">
              <j-input placeholder="请输入计划物料清单" v-model="queryParam.materialListCode"></j-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="工厂编码">
              <j-input placeholder="请输入工厂编码" v-model="queryParam.factoryCode"></j-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="工厂名称">
              <j-input placeholder="请输入工厂名称" v-model="queryParam.factoryName"></j-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="客户型号">
              <j-input placeholder="请输入客户型号" v-model="queryParam.customerOrderModel"></j-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="客户名称">
              <j-input placeholder="请输入客户名称" v-model="queryParam.customer"></j-input>
              <j-dict-select-tag dictCode="production_order_status" placeholder="请选择订单状态"
                                 v-model="queryParam.orderStatus"></j-dict-select-tag>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
              <a-button type="info" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!-- æŸ¥è¯¢åŒºåŸŸ-END -->
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <div class="table-operator">
      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
      <!-- é«˜çº§æŸ¥è¯¢åŒºåŸŸ -->
      <a-dropdown v-if="selectedRowKeys.length > 0">
        <a-menu slot="overlay">
          <a-menu-item key="1" @click="batchDel">
            <a-icon type="delete" />
            åˆ é™¤
          </a-menu-item>
        </a-menu>
        <a-button style="margin-left: 8px"> æ‰¹é‡æ“ä½œ
          <a-icon type="down" />
        </a-button>
      </a-dropdown>
    </div>
    <!-- table区域-begin -->
    <div>
@@ -110,47 +63,11 @@
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
        class="j-table-force-nowrap"
        @change="handleTableChange">
        <template slot="htmlSlot" slot-scope="text">
          <div v-html="text"></div>
        </template>
        <template slot="imgSlot" slot-scope="text,record">
          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt=""
               style="max-width:80px;font-size: 12px;font-style: italic;" />
        </template>
        <template slot="fileSlot" slot-scope="text">
          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
          <a-button
            v-else
            :ghost="true"
            type="primary"
            icon="download"
            size="small"
            @click="downloadFile(text)">
            ä¸‹è½½
          </a-button>
        </template>
        <span slot="action" slot-scope="text, record">
          <a @click="handleEdit(record)">编辑</a>
          <a-divider type="vertical" />
          <a-dropdown>
            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
            <a-menu slot="overlay">
              <a-menu-item>
                <a @click="handleDetail(record)">详情</a>
              </a-menu-item>
              <a-menu-item>
                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
                  <a>删除</a>
                </a-popconfirm>
              </a-menu-item>
            </a-menu>
          </a-dropdown>
          <a @click="handleDetail(record)">详情</a>
        </span>
      </a-table>
    </div>
@@ -164,7 +81,6 @@
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import MesProductionOrderModal from './modules/MesProductionOrderModal'
import { filterMultiDictText } from '@/components/dict/JDictSelectUtil'
export default {
  name: 'MesProductionOrderList',
@@ -185,22 +101,26 @@
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          }
          },
          fixed: 'left',
        },
        {
          title: '生产订单号',
          align: 'center',
          dataIndex: 'orderCode'
          dataIndex: 'orderCode',
          fixed: 'left',
        },
        {
          title: '订单类型',
          align: 'center',
          dataIndex: 'orderCategory'
          dataIndex: 'orderCategory_dictText',
          fixed: 'left',
        },
        {
          title: '物料编号',
          align: 'center',
          dataIndex: 'materialNumber'
          dataIndex: 'materialNumber',
          fixed: 'left',
        },
        {
          title: '物料名称',
@@ -223,19 +143,24 @@
          dataIndex: 'orderQuantity'
        },
        {
          title: '产品单位',
          title: '基本计量单位',
          align: 'center',
          dataIndex: 'productionUnit_dictText'
          dataIndex: 'productionUnit'
        },
        {
          title: '订单状态',
          align: 'center',
          dataIndex: 'orderStatus_dictText'
          dataIndex: 'orderStatus'
        },
        {
          title: '订单状态描述',
          align: 'center',
          dataIndex: 'orderStatusName'
        },
        {
          title: '优先级',
          align: 'center',
          dataIndex: 'priority_dictText'
          dataIndex: 'priority'
        },
        {
          title: '计划工艺路线',
@@ -256,6 +181,36 @@
          title: '工厂名称',
          align: 'center',
          dataIndex: 'factoryName'
        },
        {
          title: '调度员编号',
          align: 'center',
          dataIndex: 'dispatcherCode'
        },
        {
          title: '调度员名称',
          align: 'center',
          dataIndex: 'dispatcherName'
        },
        {
          title: '订单创建日期',
          align: 'center',
          dataIndex: 'orderCreateDate'
        },
        {
          title: '订单更新日期',
          align: 'center',
          dataIndex: 'orderUpdateDate'
        },
        {
          title: '订单更新时间',
          align: 'center',
          dataIndex: 'orderUpdateTime'
        },
        {
          title: '订单修改人',
          align: 'center',
          dataIndex: 'orderUpdateUser'
        },
        {
          title: '客户型号',
@@ -282,50 +237,16 @@
        }
      ],
      url: {
        list: '/mesproductionwork/mesProductionOrder/list',
        delete: '/mesproductionwork/mesProductionOrder/delete',
        deleteBatch: '/mesproductionwork/mesProductionOrder/deleteBatch',
        exportXlsUrl: '/mesproductionwork/mesProductionOrder/exportXls',
        importExcelUrl: 'mesproductionwork/mesProductionOrder/importExcel'
        list: '/mes/productionOrder/list',
      },
      dictOptions: {},
      superFieldList: []
    }
  },
  created() {
    this.getSuperFieldList()
  },
  computed: {
    importExcelUrl: function() {
      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
    }
  },
  methods: {
    initDictConfig() {
    },
    getSuperFieldList() {
      let fieldList = []
      fieldList.push({ type: 'int', value: 'delFlag', text: '删除标记', dictCode: '' })
      fieldList.push({ type: 'string', value: 'orderCode', text: '生产订单号', dictCode: '' })
      fieldList.push({ type: 'string', value: 'orderCategory', text: '订单类型', dictCode: '' })
      fieldList.push({ type: 'string', value: 'materialNumber', text: '物料编号', dictCode: '' })
      fieldList.push({ type: 'string', value: 'materialName', text: '物料名称', dictCode: '' })
      fieldList.push({ type: 'datetime', value: 'planStart', text: '计划开始日期' })
      fieldList.push({ type: 'datetime', value: 'planEnd', text: '计划结束日期' })
      fieldList.push({ type: 'double', value: 'orderQuantity', text: '订单数量', dictCode: '' })
      fieldList.push({ type: 'string', value: 'productionUnit', text: '产品单位', dictCode: 'production_unit' })
      fieldList.push({ type: 'string', value: 'orderStatus', text: '订单状态', dictCode: 'order_status' })
      fieldList.push({ type: 'string', value: 'priority', text: '优先级', dictCode: 'priority' })
      fieldList.push({ type: 'string', value: 'processRoute', text: '计划工艺路线', dictCode: '' })
      fieldList.push({ type: 'string', value: 'materialListCode', text: '计划物料清单', dictCode: '' })
      fieldList.push({ type: 'string', value: 'factoryCode', text: '工厂编码', dictCode: '' })
      fieldList.push({ type: 'string', value: 'factoryName', text: '工厂名称', dictCode: '' })
      fieldList.push({ type: 'string', value: 'customerOrderModel', text: '客户型号', dictCode: '' })
      fieldList.push({ type: 'string', value: 'customer', text: '客户名称', dictCode: '' })
      fieldList.push({ type: 'string', value: 'remark', text: '备注', dictCode: '' })
      this.superFieldList = fieldList
    }
  }
}
</script>
src/views/mes/modules/MesProductionOrderForm.vue
@@ -1,91 +1,135 @@
<template>
  <a-spin :spinning="confirmLoading">
    <j-form-container disabled>
      <a-form-model ref="form1" :model="model" :rules="validatorRules" slot="detail">
        <a-row>
          <a-col :span="8">
            <a-form-model-item label="生产订单号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCode">
              <a-input v-model="model.orderCode" ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="订单类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCategory">
              <j-dict-select-tag v-model="model.orderCategory" dictCode="production_order_category"></j-dict-select-tag>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="物料编号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialNumber">
              <a-input v-model="model.materialNumber"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName">
              <a-input v-model="model.materialName"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="计划开始日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="planStart">
              <j-date v-model="model.planStart" :show-time="true"
                      date-format="YYYY-MM-DD" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="计划结束日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="planEnd">
              <j-date v-model="model.planEnd" :show-time="true"
                      date-format="YYYY-MM-DD" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="订单数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderQuantity">
              <a-input-number v-model="model.orderQuantity" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="基本计量单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="productionUnit">
              <a-input v-model="model.productionUnit" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="订单状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderStatus">
              <a-input v-model="model.orderStatus" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="订单状态描述" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderStatusName">
              <a-input v-model="model.orderStatusName" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="优先级" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="priority">
              <a-input v-model="model.priority" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="计划工艺路线" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="processRoute">
              <a-input v-model="model.processRoute" placeholder="请输入计划工艺路线"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="计划物料清单" :labelCol="labelCol" :wrapperCol="wrapperCol"
                               prop="materialListCode">
              <a-input v-model="model.materialListCode"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="工厂编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryCode">
              <a-input v-model="model.factoryCode"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="工厂名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryName">
              <a-input v-model="model.factoryName" ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="调度员编号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dispatcherCode">
              <a-input v-model="model.dispatcherCode"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="调度员名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dispatcherName">
              <a-input v-model="model.dispatcherName" ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="订单创建日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCreateDate">
              <a-input v-model="model.orderCreateDate"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="订单更新日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderUpdateDate">
              <a-input v-model="model.orderUpdateDate" ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="订单更新时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderUpdateTime">
              <a-input v-model="model.orderUpdateTime"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item label="订单修改人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderUpdateUser">
              <a-input v-model="model.orderUpdateUser" ></a-input>
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </j-form-container>
    <j-form-container :disabled="formDisabled">
      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
        <a-row>
          <a-col :span="12">
            <a-form-model-item label="生产订单号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCode">
              <a-input v-model="model.orderCode" placeholder="请输入生产订单号"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="订单类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCategory">
              <j-dict-select-tag v-model="model.orderCategory" dictCode="orderCategory" placeholder="请输入订单类型"  ></j-dict-select-tag>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="物料编号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialNumber">
              <a-input v-model="model.materialNumber" placeholder="请输入物料编号"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName">
              <a-input v-model="model.materialName" placeholder="请输入物料名称"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="计划开始日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="planStart">
              <j-date placeholder="请选择计划开始日期"  v-model="model.planStart" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="计划结束日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="planEnd">
              <j-date placeholder="请选择计划结束日期"  v-model="model.planEnd" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="订单数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderQuantity">
              <a-input-number v-model="model.orderQuantity" placeholder="请输入订单数量" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="产品单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="productionUnit">
              <j-dict-select-tag type="list" v-model="model.productionUnit" dictCode="production_unit" placeholder="请选择产品单位" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="订单状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderStatus">
              <j-dict-select-tag type="list" v-model="model.orderStatus" dictCode="order_status" placeholder="请选择订单状态" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="优先级" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="priority">
              <j-dict-select-tag type="list" v-model="model.priority" dictCode="priority" placeholder="请选择优先级" />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="计划工艺路线" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="processRoute">
              <a-input v-model="model.processRoute" placeholder="请输入计划工艺路线"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="计划物料清单" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialListCode">
              <a-input v-model="model.materialListCode" placeholder="请输入计划物料清单"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="工厂编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryCode">
              <a-input v-model="model.factoryCode" placeholder="请输入工厂编码"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="工厂名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryName">
              <a-input v-model="model.factoryName" placeholder="请输入工厂名称"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="客户型号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="customerOrderModel">
              <a-input v-model="model.customerOrderModel" placeholder="请输入客户型号"  ></a-input>
              <a-input v-model="model.customerOrderModel" placeholder="请输入客户型号"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="客户名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="customer">
              <a-input v-model="model.customer" placeholder="请输入客户名称"  ></a-input>
              <a-input v-model="model.customer" placeholder="请输入客户名称"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
              <a-input v-model="model.remark" placeholder="请输入备注"  ></a-input>
          <a-col :span="24">
            <a-form-model-item label="备注" :labelCol="labelColLong" :wrapperCol="wrapperColLong" prop="remark">
              <a-textarea v-model="model.remark" placeholder="请输入备注"></a-textarea>
            </a-form-model-item>
          </a-col>
        </a-row>
@@ -96,89 +140,92 @@
<script>
  import { httpAction, getAction } from '@/api/manage'
  import { validateDuplicateValue } from '@/utils/util'
import { httpAction } from '@/api/manage'
  export default {
    name: 'MesProductionOrderForm',
    components: {
    },
    props: {
      //表单禁用
      disabled: {
        type: Boolean,
        default: false,
        required: false
export default {
  name: 'MesProductionOrderForm',
  components: {},
  props: {
    //表单禁用
    disabled: {
      type: Boolean,
      default: false,
      required: false
    }
  },
  data() {
    return {
      model: {},
      labelCol: {
        xs: { span: 24 },
        sm: { span: 6 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      },
      labelColLong: {
        xs: { span: 24 },
        sm: { span: 3 }
      },
      wrapperColLong: {
        xs: { span: 24 },
        sm: { span: 20 }
      },
      confirmLoading: false,
      validatorRules: {},
      url: {
        edit: '/mes/productionOrder/edit',
        queryById: '/mes/productionOrder/queryById'
      }
    }
  },
  computed: {
    formDisabled() {
      return this.disabled
    }
  },
  created() {
    //备份model原始值
    this.modelDefault = JSON.parse(JSON.stringify(this.model))
  },
  methods: {
    add() {
      this.edit(this.modelDefault)
    },
    data () {
      return {
        model:{
         },
        labelCol: {
          xs: { span: 24 },
          sm: { span: 5 },
        },
        wrapperCol: {
          xs: { span: 24 },
          sm: { span: 16 },
        },
        confirmLoading: false,
        validatorRules: {
        },
        url: {
          add: "/mesproductionwork/mesProductionOrder/add",
          edit: "/mesproductionwork/mesProductionOrder/edit",
          queryById: "/mesproductionwork/mesProductionOrder/queryById"
        }
      }
    edit(record) {
      this.model = Object.assign({}, record)
      this.visible = true
    },
    computed: {
      formDisabled(){
        return this.disabled
      },
    },
    created () {
       //备份model原始值
      this.modelDefault = JSON.parse(JSON.stringify(this.model));
    },
    methods: {
      add () {
        this.edit(this.modelDefault);
      },
      edit (record) {
        this.model = Object.assign({}, record);
        this.visible = true;
      },
      submitForm () {
        const that = this;
        // è§¦å‘表单验证
        this.$refs.form.validate(valid => {
          if (valid) {
            that.confirmLoading = true;
            let httpurl = '';
            let method = '';
            if(!this.model.id){
              httpurl+=this.url.add;
              method = 'post';
            }else{
              httpurl+=this.url.edit;
               method = 'put';
            }
            httpAction(httpurl,this.model,method).then((res)=>{
              if(res.success){
                that.$message.success(res.message);
                that.$emit('ok');
              }else{
                that.$message.warning(res.message);
              }
            }).finally(() => {
              that.confirmLoading = false;
            })
    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/mes/modules/MesProductionOrderModal.vue
@@ -8,53 +8,55 @@
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @cancel="handleCancel"
    cancelText="关闭">
    <mes-production-order-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></mes-production-order-form>
    <mes-production-order-form ref="realForm" @ok="submitCallback"
                               :disabled="disableSubmit"></mes-production-order-form>
  </j-modal>
</template>
<script>
  import MesProductionOrderForm from './MesProductionOrderForm'
  export default {
    name: 'MesProductionOrderModal',
    components: {
      MesProductionOrderForm
import MesProductionOrderForm from './MesProductionOrderForm'
export default {
  name: 'MesProductionOrderModal',
  components: {
    MesProductionOrderForm
  },
  data() {
    return {
      title: '',
      width: 1200,
      visible: false,
      disableSubmit: false
    }
  },
  methods: {
    add() {
      this.visible = true
      this.$nextTick(() => {
        this.$refs.realForm.add()
      })
    },
    data () {
      return {
        title:'',
        width:896,
        visible: false,
        disableSubmit: false
      }
    edit(record) {
      this.visible = true
      this.$nextTick(() => {
        this.$refs.realForm.edit(record)
      })
    },
    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()
      }
    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/pms/PmsMaterialProcessList.vue
@@ -4,46 +4,38 @@
    <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-col :xl="4" :lg="7" :md="8" :sm="24">
            <a-form-item label="订单号">
              <a-input placeholder="请输入订单号" v-model="queryParam.orderCode" allowClear></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="4" :lg="7" :md="8" :sm="24">
            <a-form-item label="物料编码">
              <j-input placeholder="请输入物料编码" v-model="queryParam.materialNumber"></j-input>
              <a-input placeholder="请输入物料编码" v-model="queryParam.materialNumber" allowClear></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="物料名称">
              <j-input placeholder="请输入物料名称" v-model="queryParam.materialName"></j-input>
              <a-input placeholder="请输入物料名称" v-model="queryParam.materialName" allowClear></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="4" :lg="7" :md="8" :sm="24">
            <a-form-item label="工序号">
              <a-input placeholder="请输入工序号" v-model="queryParam.processCode" allowClear></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
              <a-button type="info" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!-- æŸ¥è¯¢åŒºåŸŸ-END -->
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <div class="table-operator">
      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
      <!-- é«˜çº§æŸ¥è¯¢åŒºåŸŸ -->
      <a-dropdown v-if="selectedRowKeys.length > 0">
        <a-menu slot="overlay">
          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
        </a-menu>
        <a-button style="margin-left: 8px"> æ‰¹é‡æ“ä½œ <a-icon type="down" /></a-button>
      </a-dropdown>
    </div>
    <!-- table区域-begin -->
    <div>
      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
        <i class="anticon anticon-info-circle ant-alert-icon"></i> å·²é€‰æ‹© <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
      </div>
      <a-table
        ref="table"
        size="middle"
@@ -54,160 +46,97 @@
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
        class="j-table-force-nowrap"
        @change="handleTableChange">
        <template slot="htmlSlot" slot-scope="text">
          <div v-html="text"></div>
        </template>
        <template slot="imgSlot" slot-scope="text,record">
          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
        </template>
        <template slot="fileSlot" slot-scope="text">
          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
          <a-button
            v-else
            :ghost="true"
            type="primary"
            icon="download"
            size="small"
            @click="downloadFile(text)">
            ä¸‹è½½
          </a-button>
        </template>
        <span slot="action" slot-scope="text, record">
          <a @click="handleEdit(record)">编辑</a>
          <a-divider type="vertical" />
          <a-dropdown>
            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
            <a-menu slot="overlay">
              <a-menu-item>
                <a @click="handleDetail(record)">详情</a>
              </a-menu-item>
              <a-menu-item>
                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
                  <a>删除</a>
                </a-popconfirm>
              </a-menu-item>
            </a-menu>
          </a-dropdown>
          <a @click="handleDetail(record)">详情</a>
        </span>
      </a-table>
    </div>
    <pms-material-process-modal ref="modalForm" @ok="modalFormOk"></pms-material-process-modal>
  </a-card>
</template>
<script>
  import '@/assets/less/TableExpand.less'
  import { mixinDevice } from '@/utils/mixin'
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  import PmsMaterialProcessModal from './modules/PmsMaterialProcessModal'
import '@/assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import PmsMaterialProcessModal from './modules/PmsMaterialProcessModal'
  export default {
    name: 'PmsMaterialProcessList',
    mixins:[JeecgListMixin, mixinDevice],
    components: {
      PmsMaterialProcessModal
    },
    data () {
      return {
        description: '物料工序管理页面',
        // è¡¨å¤´
        columns: [
          {
            title: '#',
            dataIndex: '',
            key:'rowIndex',
            width:60,
            align:"center",
            customRender:function (t,r,index) {
              return parseInt(index)+1;
            }
          },
          {
            title:'物料编码',
            align:"center",
            dataIndex: 'materialNumber'
          },
          {
            title:'物料名称',
            align:"center",
            dataIndex: 'materialName'
          },
          {
            title:'产线ID(SAP工作中心)',
            align:"center",
            dataIndex: 'factoryId_dictText'
          },
          {
            title:'工序号',
            align:"center",
            dataIndex: 'processCode'
          },
          {
            title:'工序名称',
            align:"center",
            dataIndex: 'processName'
          },
          {
            title:'控制码',
            align:"center",
            dataIndex: 'controlCode'
          },
          {
            title: '操作',
            dataIndex: 'action',
            align:"center",
            fixed:"right",
            width:147,
            scopedSlots: { customRender: 'action' }
export default {
  name: 'PmsMaterialProcessList',
  mixins: [JeecgListMixin, mixinDevice],
  components: {
    PmsMaterialProcessModal
  },
  data() {
    return {
      description: '物料工序管理页面',
      // è¡¨å¤´
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          }
        ],
        url: {
          list: "/pms/pmsMaterialProcess/list",
          delete: "/pms/pmsMaterialProcess/delete",
          deleteBatch: "/pms/pmsMaterialProcess/deleteBatch",
          exportXlsUrl: "/pms/pmsMaterialProcess/exportXls",
          importExcelUrl: "pms/pmsMaterialProcess/importExcel",
        },
        dictOptions:{},
        superFieldList:[],
      }
    },
    created() {
    this.getSuperFieldList();
    },
    computed: {
      importExcelUrl: function(){
        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
        {
          title: '订单号',
          align: 'center',
          dataIndex: 'orderCode'
        },
        {
          title: '物料编码',
          align: 'center',
          dataIndex: 'materialNumber'
        },
        {
          title: '物料名称',
          align: 'center',
          dataIndex: 'materialName'
        },
        {
          title: '工序号',
          align: 'center',
          dataIndex: 'processCode'
        },
        {
          title: '工序名称',
          align: 'center',
          dataIndex: 'processName'
        },
        {
          title: '控制码',
          align: 'center',
          dataIndex: 'controlCode'
        },
        {
          title: '操作',
          dataIndex: 'action',
          align: 'center',
          fixed: 'right',
          width: 147,
          scopedSlots: { customRender: 'action' }
        }
      ],
      url: {
        list: '/pms/materialProcess/list'
      },
    },
    methods: {
      initDictConfig(){
      },
      getSuperFieldList(){
        let fieldList=[];
        fieldList.push({type:'int',value:'delFlag',text:'删除标记',dictCode:''})
        fieldList.push({type:'string',value:'materialNumber',text:'物料编码',dictCode:''})
        fieldList.push({type:'string',value:'materialName',text:'物料名称',dictCode:''})
        fieldList.push({type:'string',value:'factoryId',text:'产线ID(SAP工作中心)',dictCode:''})
        fieldList.push({type:'string',value:'processCode',text:'工序号',dictCode:''})
        fieldList.push({type:'string',value:'processName',text:'工序名称',dictCode:''})
        fieldList.push({type:'string',value:'controlCode',text:'控制码',dictCode:''})
        this.superFieldList = fieldList
      }
      dictOptions: {}
    }
  }
  },
  created() {
  },
  computed: {},
  methods: {}
}
</script>
<style scoped>
  @import '~@assets/less/common.less';
@import '~@assets/less/common.less';
</style>
src/views/pms/PmsProcessBillMaterialsList.vue
@@ -5,19 +5,24 @@
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="订单号">
              <a-input placeholder="请输入订单号" v-model="queryParam.orderCode" allowClear></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="物料编码">
              <j-input placeholder="请输入物料编码" v-model="queryParam.materialNumber"></j-input>
              <a-input placeholder="请输入物料编码" v-model="queryParam.materialNumber" allowClear></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="物料名称">
              <j-input placeholder="请输入物料名称" v-model="queryParam.materialName"></j-input>
              <a-input placeholder="请输入物料名称" v-model="queryParam.materialName" allowClear></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
              <a-button type="info" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
            </span>
          </a-col>
        </a-row>
@@ -25,24 +30,8 @@
    </div>
    <!-- æŸ¥è¯¢åŒºåŸŸ-END -->
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <div class="table-operator">
      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
      <!-- é«˜çº§æŸ¥è¯¢åŒºåŸŸ -->
      <a-dropdown v-if="selectedRowKeys.length > 0">
        <a-menu slot="overlay">
          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
        </a-menu>
        <a-button style="margin-left: 8px"> æ‰¹é‡æ“ä½œ <a-icon type="down" /></a-button>
      </a-dropdown>
    </div>
    <!-- table区域-begin -->
    <div>
      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
        <i class="anticon anticon-info-circle ant-alert-icon"></i> å·²é€‰æ‹© <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
      </div>
      <a-table
        ref="table"
        size="middle"
@@ -53,189 +42,152 @@
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
        class="j-table-force-nowrap"
        :expandedRowKeys.sync="expandedRowKeys"
        @expand="handleExpand"
        @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>
        <a-table
          slot="expandedRowRender"
          slot-scope="text"
          :scroll="{x:true}"
          :columns="innerColumns"
          :data-source="innerData"
          :pagination="false"
        ></a-table>
        <span slot="action" slot-scope="text, record">
          <a @click="handleEdit(record)">编辑</a>
          <a-divider type="vertical" />
          <a-dropdown>
            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
            <a-menu slot="overlay">
              <a-menu-item>
                <a @click="handleDetail(record)">详情</a>
              </a-menu-item>
              <a-menu-item>
                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
                  <a>删除</a>
                </a-popconfirm>
              </a-menu-item>
            </a-menu>
          </a-dropdown>
        </span>
        <span slot="figureNum" slot-scope="text, record">
          <span v-if="record.materialNumber == null || '' == record.materialNumber">无数据</span>
          <span v-else>
            <a-popover placement="top" :title="'物料基本信息:'" arrow-point-at-center>
              <template slot="content">
              </template>
              <a-button class="fontweight" style="font-weight: bold;color: inherit;" @click="handleMaterialClick(record)">
                {{ record.materialNumber }}
              </a-button>
            </a-popover>
          </span>
          <a @click="handleDetail(record)">详情</a>
        </span>
      </a-table>
    </div>
    <pms-process-bill-materials-modal ref="modalForm" @ok="modalFormOk"></pms-process-bill-materials-modal>
    <PmsProcessBillMaterialsDetailModal ref="PmsProcessBillMaterialsDetailModal"></PmsProcessBillMaterialsDetailModal>
  </a-card>
</template>
<script>
  import '@/assets/less/TableExpand.less'
  import { mixinDevice } from '@/utils/mixin'
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  import PmsProcessBillMaterialsModal from './modules/PmsProcessBillMaterialsModal'
  import PmsProcessBillMaterialsDetailModal from './modules/PmsProcessBillMaterialsDetailModal.vue'
  import { getAction } from '@api/manage'
import '@/assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import PmsProcessBillMaterialsModal from './modules/PmsProcessBillMaterialsModal'
import { getAction } from '@api/manage'
  export default {
    name: 'PmsProcessBillMaterialsList',
    mixins:[JeecgListMixin, mixinDevice],
    components: {
      PmsProcessBillMaterialsModal,
      PmsProcessBillMaterialsDetailModal
    },
    data () {
      return {
        description: '订单BOM管理页面',
        // è¡¨å¤´
        columns: [
          {
            title: '#',
            dataIndex: '',
            key:'rowIndex',
            width:60,
            align:"center",
            customRender:function (t,r,index) {
              return parseInt(index)+1;
            }
          },
          {
            title:'生成订单ID',
            align:"center",
            dataIndex: 'orderId'
          },
          {
            title:'物料编码',
            align:"center",
            dataIndex: 'materialNumber',
            defaultSortOrder: 'descend',
            scopedSlots: { customRender: 'figureNum', },
          },
          {
            title:'物料名称',
            align:"center",
            dataIndex: 'materialName'
          },
          {
            title:'BOM代码',
            align:"center",
            dataIndex: 'billMaterialsCode'
          },
          {
            title:'基本单位',
            align:"center",
            dataIndex: 'productionUnit'
          },
          {
            title:'订单数量',
            align:"center",
            dataIndex: 'productionQuantity'
          },
          {
            title: '操作',
            dataIndex: 'action',
            align:"center",
            fixed:"right",
            width:147,
            scopedSlots: { customRender: 'action' }
export default {
  name: 'PmsProcessBillMaterialsList',
  mixins: [JeecgListMixin, mixinDevice],
  components: {
    PmsProcessBillMaterialsModal
  },
  data() {
    return {
      description: '订单BOM管理页面',
      innerData: [],
      expandedRowKeys: [],
      // è¡¨å¤´
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          }
        ],
        url: {
          list: "/pmsprocessbillmaterials/pmsProcessBillMaterials/list",
          delete: "/pmsprocessbillmaterials/pmsProcessBillMaterials/delete",
          deleteBatch: "/pmsprocessbillmaterials/pmsProcessBillMaterials/deleteBatch",
          exportXlsUrl: "/pmsprocessbillmaterials/pmsProcessBillMaterials/exportXls",
          importExcelUrl: "pmsprocessbillmaterials/pmsProcessBillMaterials/importExcel",
          queryByMaterialId:'/pms/pmsProcessBillMaterialsDetail/queryByMaterialId'
        },
        dictOptions:{},
        superFieldList:[],
      }
    },
    created() {
    this.getSuperFieldList();
    },
    computed: {
      importExcelUrl: function(){
        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
        {
          title: '订单号',
          align: 'center',
          dataIndex: 'orderCode'
        },
        {
          title: '物料编码',
          align: 'center',
          dataIndex: 'materialNumber'
        },
        {
          title: '物料名称',
          align: 'center',
          dataIndex: 'materialName'
        },
        {
          title: '基本单位',
          align: 'center',
          dataIndex: 'productionUnit'
        },
        {
          title: '订单数量',
          align: 'center',
          dataIndex: 'productionQuantity'
        },
        {
          title: '操作',
          dataIndex: 'action',
          align: 'center',
          width: 147,
          scopedSlots: { customRender: 'action' }
        }
      ],
      innerColumns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          }
        },
        {
          title: '物料编码',
          align: 'center',
          dataIndex: 'materialNumber'
        },
        {
          title: '物料名称',
          align: 'center',
          dataIndex: 'materialName'
        },
        {
          title: '基本单位',
          align: 'center',
          dataIndex: 'productionUnit'
        },
        {
          title: '需求数量',
          align: 'center',
          dataIndex: 'usageQuantity'
        }
      ],
      url: {
        list: '/pms/processBillMaterials/list',
        queryByMaterialId: '/pms/processBillMaterialsDetail/queryByMaterialId'
      },
    },
    methods: {
      handleMaterialClick(record){
        console.log('record----->',record)
        getAction(this.url.queryByMaterialId,{'materialId':record.id}).then(res=>{
    }
  },
  created() {
  },
  computed: {},
  methods: {
    handleExpand(expanded, record) {
      let that = this
      if(expanded) {
        this.expandedRowKeys = [record.id];
        getAction(that.url.queryByMaterialId, {materialId: record.id}).then((res)=>{
          if(res.success){
            this.$refs.PmsProcessBillMaterialsDetailModal.edit(res.result);
            this.$refs.PmsProcessBillMaterialsDetailModal.title="物料清单";
            this.$refs.PmsProcessBillMaterialsDetailModal.disableSubmit = true;
            this.innerData = [...res.result];
          }else{
            this.$message.error('没查到数据,请联系管理员')
            that.$message.warning(res.message);
            this.innerData = [];
          }
        })
      },
      initDictConfig(){
      },
      getSuperFieldList(){
        let fieldList=[];
        fieldList.push({type:'int',value:'delFlag',text:'删除标记',dictCode:''})
        fieldList.push({type:'string',value:'orderId',text:'生成订单ID',dictCode:''})
        fieldList.push({type:'string',value:'materialNumber',text:'物料编码',dictCode:''})
        fieldList.push({type:'string',value:'materialName',text:'物料名称',dictCode:''})
        fieldList.push({type:'string',value:'billMaterialsCode',text:'BOM代码',dictCode:''})
        fieldList.push({type:'string',value:'productionUnit',text:'基本单位',dictCode:''})
        fieldList.push({type:'double',value:'productionQuantity',text:'订单数量',dictCode:''})
        this.superFieldList = fieldList
      } else {
        this.expandedRowKeys = [];
      }
    }
  }
}
</script>
<style scoped>
  @import '~@assets/less/common.less';
@import '~@assets/less/common.less';
</style>
src/views/pms/modules/PmsMaterialProcessForm.vue
@@ -4,50 +4,33 @@
      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
        <a-row>
          <a-col :span="12">
            <a-form-model-item label="订单号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCode">
              <a-input v-model="model.orderCode"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="物料编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialNumber">
              <a-input v-model="model.materialNumber" placeholder="请输入物料编码"  ></a-input>
              <a-input v-model="model.materialNumber"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName">
              <a-input v-model="model.materialName" placeholder="请输入物料名称"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="产线ID(SAP工作中心)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="factoryId">
                <a-row :gutter="24">
                  <a-col :span="24">
                    <a-form-item
                      :labelCol="labelCol"
                      :wrapperCol="wrapperCol"
                      label=""
                    >
                      <j-select-factory
                        :disabled="disabled"
                        v-model="model.factoryId"
                        :multi="true"
                        @back="backFactoryInfo"
                        :backProduction="true"
                        :treeProductOpera="true"
                      ></j-select-factory>
                    </a-form-item>
                  </a-col>
                </a-row>
              <a-input v-model="model.materialName"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="工序号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="processCode">
              <a-input v-model="model.processCode" placeholder="请输入工序号"  ></a-input>
              <a-input v-model="model.processCode"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="工序名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="processName">
              <a-input v-model="model.processName" placeholder="请输入工序名称"  ></a-input>
              <a-input v-model="model.processName"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="控制码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="controlCode">
              <a-input v-model="model.controlCode" placeholder="请输入控制码"  ></a-input>
              <a-input v-model="model.controlCode"></a-input>
            </a-form-model-item>
          </a-col>
        </a-row>
@@ -58,115 +41,50 @@
<script>
  import { httpAction, getAction } from '@/api/manage'
  import { validateDuplicateValue } from '@/utils/util'
  import JSelectFactory from '@comp/jeecgbiz/JSelectFactory.vue'
  import JTreeDict from '@/components/jeecg/JTreeDict'//分类字典树形下拉组件
  export default {
    name: 'PmsMaterialProcessForm',
    components: {
      JSelectFactory,
      JTreeDict
    },
    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: {
          factoryId: [
            { required: true, message: '产线是必选项', trigger: 'change' }
          ],
          materialNumber: [
            { required: true, message: '物料编码是必选项', trigger: 'change' }
          ],
          materialName: [
            { required: true, message: '物料名称是必选项', trigger: 'change' }
          ],
          processCode: [
            { required: true, message: '工序号是必选项', trigger: 'change' }
          ],
          processName: [
            { required: true, message: '工序名称是必选项', trigger: 'change' }
          ],
        },
        url: {
          add: "/pms/pmsMaterialProcess/add",
          edit: "/pms/pmsMaterialProcess/edit",
          queryById: "/pms/pmsMaterialProcess/queryById"
        }
      }
    },
    computed: {
      formDisabled(){
        return this.disabled
export default {
  name: 'PmsMaterialProcessForm',
  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: {},
      url: {}
    }
  },
  computed: {
    formDisabled() {
      return this.disabled
    }
  },
  created() {
    //备份model原始值
    this.modelDefault = JSON.parse(JSON.stringify(this.model))
  },
  methods: {
    add() {
      this.edit(this.modelDefault)
    },
    created () {
       //备份model原始值
      this.modelDefault = JSON.parse(JSON.stringify(this.model));
    },
    methods: {
      backFactoryInfo(info) {
        this.model.factoryIds = this.model.factoryId
        this.nextFactoryOptions = info.map((item, index, arr) => {
          let c = { label: item.text, value: item.value + '' }
          return c
        })
      },
      add () {
        this.edit(this.modelDefault);
      },
      edit (record) {
        this.model = Object.assign({}, record);
        this.visible = true;
      },
      submitForm () {
        const that = this;
        // è§¦å‘表单验证
        this.$refs.form.validate(valid => {
          if (valid) {
            that.confirmLoading = true;
            let httpurl = '';
            let method = '';
            if(!this.model.id){
              httpurl+=this.url.add;
              method = 'post';
            }else{
              httpurl+=this.url.edit;
               method = 'put';
            }
            httpAction(httpurl,this.model,method).then((res)=>{
              if(res.success){
                that.$message.success(res.message);
                that.$emit('ok');
              }else{
                that.$message.warning(res.message);
              }
            }).finally(() => {
              that.confirmLoading = false;
            })
          }
        })
      },
    edit(record) {
      this.model = Object.assign({}, record)
      this.visible = true
    }
  }
}
</script>
src/views/pms/modules/PmsProcessBillMaterialsForm.vue
@@ -4,33 +4,28 @@
      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
        <a-row>
          <a-col :span="12">
            <a-form-model-item label="生成订单" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderId">
              <a-input v-model="model.orderId" placeholder="请输入生成订单ID"  ></a-input>
            <a-form-model-item label="订单号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderCode">
              <a-input v-model="model.orderCode"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="物料编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialNumber">
              <a-input v-model="model.materialNumber" placeholder="请输入物料编码"  ></a-input>
              <a-input v-model="model.materialNumber"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName">
              <a-input v-model="model.materialName" placeholder="请输入物料名称"  ></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="BOM代码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="billMaterialsCode">
              <a-input v-model="model.billMaterialsCode" placeholder="请输入BOM代码"  ></a-input>
              <a-input v-model="model.materialName"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="基本单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="productionUnit">
              <a-input v-model="model.productionUnit" placeholder="请输入基本单位"  ></a-input>
              <a-input v-model="model.productionUnit"></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item label="订单数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="productionQuantity">
              <a-input-number v-model="model.productionQuantity" placeholder="请输入订单数量" style="width: 100%" />
              <a-input-number v-model="model.productionQuantity" style="width: 100%" />
            </a-form-model-item>
          </a-col>
        </a-row>
@@ -41,104 +36,54 @@
<script>
  import { httpAction, getAction } from '@/api/manage'
  import { validateDuplicateValue } from '@/utils/util'
import { httpAction } from '@/api/manage'
  export default {
    name: 'PmsProcessBillMaterialsForm',
    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: {
          orderId: [
            { required: true, message: '生成订单是必选项', trigger: 'change' }
          ],
          materialNumber: [
            { required: true, message: '物料编码是必填项', trigger: 'change' }
          ],
          materialName: [
            { required: true, message: '物料名称是必填项', trigger: 'change' }
          ],
          productionUnit: [
            { required: true, message: '基本单位是必填项', trigger: 'change' }
          ],
          productionQuantity: [
            { required: true, message: '订单数量是必填项', trigger: 'change' }
          ],
        },
        url: {
          add: "/pmsprocessbillmaterials/pmsProcessBillMaterials/add",
          edit: "/pmsprocessbillmaterials/pmsProcessBillMaterials/edit",
          queryById: "/pmsprocessbillmaterials/pmsProcessBillMaterials/queryById"
        }
      }
    },
    computed: {
      formDisabled(){
        return this.disabled
      },
    },
    created () {
       //备份model原始值
      this.modelDefault = JSON.parse(JSON.stringify(this.model));
    },
    methods: {
      add () {
        this.edit(this.modelDefault);
      },
      edit (record) {
        this.model = Object.assign({}, record);
        this.visible = true;
      },
      submitForm () {
        const that = this;
        // è§¦å‘表单验证
        this.$refs.form.validate(valid => {
          if (valid) {
            that.confirmLoading = true;
            let httpurl = '';
            let method = '';
            if(!this.model.id){
              httpurl+=this.url.add;
              method = 'post';
            }else{
              httpurl+=this.url.edit;
               method = 'put';
            }
            httpAction(httpurl,this.model,method).then((res)=>{
              if(res.success){
                that.$message.success(res.message);
                that.$emit('ok');
              }else{
                that.$message.warning(res.message);
              }
            }).finally(() => {
              that.confirmLoading = false;
            })
          }
        })
      },
export default {
  name: 'PmsProcessBillMaterialsForm',
  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: {
      },
      url: {
      }
    }
  },
  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
    },
  }
}
</script>
src/views/pms/modules/PmsProcessBillMaterialsModal.vue
@@ -8,53 +8,55 @@
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @cancel="handleCancel"
    cancelText="关闭">
    <pms-process-bill-materials-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></pms-process-bill-materials-form>
    <pms-process-bill-materials-form ref="realForm" @ok="submitCallback"
                                     :disabled="disableSubmit"></pms-process-bill-materials-form>
  </j-modal>
</template>
<script>
  import PmsProcessBillMaterialsForm from './PmsProcessBillMaterialsForm'
  export default {
    name: 'PmsProcessBillMaterialsModal',
    components: {
      PmsProcessBillMaterialsForm
import PmsProcessBillMaterialsForm from './PmsProcessBillMaterialsForm'
export default {
  name: 'PmsProcessBillMaterialsModal',
  components: {
    PmsProcessBillMaterialsForm
  },
  data() {
    return {
      title: '',
      width: 896,
      visible: false,
      disableSubmit: false
    }
  },
  methods: {
    add() {
      this.visible = true
      this.$nextTick(() => {
        this.$refs.realForm.add()
      })
    },
    data () {
      return {
        title:'',
        width:896,
        visible: false,
        disableSubmit: false
      }
    edit(record) {
      this.visible = true
      this.$nextTick(() => {
        this.$refs.realForm.edit(record)
      })
    },
    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()
      }
    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/SysApiLogList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,198 @@
<template>
  <a-card :bordered="false">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="API分类">
              <j-search-select-tag
                placeholder="请选择API分类"
                v-model="queryParam.apiCategory"
                dict="api_log_category"
              />
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item label="接口名称">
              <j-input placeholder="请输入接口名称" v-model="queryParam.apiName"></j-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="info" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </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"
        :scroll="{ x: 200 }"
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
        @change="handleTableChange">
        <span slot="action" slot-scope="text, record">
          <a @click="handleDetail(record)">详情</a>
        </span>
      </a-table>
    </div>
    <!-- table区域-end -->
    <!-- è¡¨å•区域 -->
    <sysApiLog-modal ref="modalForm" @ok="modalFormOk"></sysApiLog-modal>
  </a-card>
</template>
<script>
import '@/assets/less/TableExpand.less'
import SysApiLogModal from './modules/SysApiLogModal'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
export default {
  name: 'SysApiLogList',
  mixins: [JeecgListMixin],
  components: {
    SysApiLogModal
  },
  data() {
    return {
      description: '系统第三方集成接口日志管理页面',
      // è¡¨å¤´
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          },
          fixed: 'left',
        },
        {
          title: 'API分类',
          align: 'center',
          dataIndex: 'apiCategory',
          fixed: 'left',
          width: 100,
        },
        {
          title: '接口名称',
          align: 'center',
          dataIndex: 'apiName',
          fixed: 'left',
          width: 200,
          ellipsis: true,
        },
        {
          title: '请求时间',
          align: 'center',
          dataIndex: 'requestTime',
          width: 150,
        },
        {
          title: '响应时间',
          align: 'center',
          dataIndex: 'responseTime',
          width: 150,
        },
        {
          title: '请求方式',
          align: 'center',
          dataIndex: 'requestMethod',
          width: 100,
        },
        {
          title: '请求URL',
          align: 'center',
          dataIndex: 'requestUrl',
          width: 200,
          ellipsis: true,
        },
        {
          title: '请求头',
          align: 'center',
          dataIndex: 'requestHeaders',
          width: 200,
          ellipsis: true,
        },
        {
          title: '请求体',
          align: 'center',
          dataIndex: 'requestBody',
          width: 200,
          ellipsis: true,
        },
        {
          title: '响应编码',
          align: 'center',
          dataIndex: 'responseCode',
          width: 100,
        },
        {
          title: '响应消息',
          align: 'center',
          dataIndex: 'responseMessage',
          width: 200,
        },
        {
          title: '响应体',
          align: 'center',
          dataIndex: 'responseBody',
          width: 200,
          ellipsis: true,
        },
        {
          title: '状态',
          align: 'center',
          dataIndex: 'requestStatus',
          width: 100,
        },
        {
          title: '调用方法',
          align: 'center',
          dataIndex: 'method',
          width: 200,
          ellipsis: true,
        },
        {
          title: '操作',
          dataIndex: 'action',
          align: 'center',
          scopedSlots: { customRender: 'action' },
          fixed: 'right',
        }
      ],
      url: {
        list: '/system/sysApiLog/list',
      }
    }
  },
  computed: {
  },
  methods: {}
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>
src/views/system/modules/SysApiLogModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,189 @@
<template>
  <j-modal
    :title="title"
    :width="800"
    :visible="visible"
    :confirmLoading="confirmLoading"
    fullscreen
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @ok="handleOk"
    @cancel="handleCancel"
    cancelText="关闭">
    <a-spin :spinning="confirmLoading">
      <a-form-model ref="form" :model="model" :rules="validatorRules" :labelCol="labelCol" :wrapperCol="wrapperCol">
        <a-row>
          <a-col :span="12">
            <a-form-model-item prop="apiCategory" label="API分类">
              <a-input v-model="model.apiCategory" readonly />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item prop="apiName" label="接口名称">
              <a-input v-model="model.apiName" readonly />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="12">
            <a-form-model-item prop="requestTime" label="请求时间">
              <a-input v-model="model.requestTime" readonly />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item prop="responseTime" label="响应时间">
              <a-input v-model="model.responseTime" readonly />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="12">
            <a-form-model-item prop="requestMethod" label="请求方式">
              <a-input v-model="model.requestMethod" readonly />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item prop="requestStatus" label="请求状态">
              <a-input v-model="model.requestStatus" readonly />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="12">
            <a-form-model-item prop="responseCode" label="响应编码">
              <a-input v-model="model.responseCode" readonly />
            </a-form-model-item>
          </a-col>
          <a-col :span="12">
            <a-form-model-item prop="responseMessage" label="响应消息">
              <a-input v-model="model.responseMessage" readonly />
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row>
          <a-form-model-item :labelCol="labelColLong" :wrapperCol="wrapperColLong" prop="requestUrl"
                             label="请求URL">
            <a-textarea v-model="model.requestUrl" :rows="1" readonly />
          </a-form-model-item>
        </a-row>
        <a-row>
          <a-form-model-item :labelCol="labelColLong" :wrapperCol="wrapperColLong" prop="requestHeaders" label="请求头">
            <a-textarea v-model="model.requestHeaders" :rows="2" readonly />
          </a-form-model-item>
        </a-row>
        <a-row>
          <a-form-model-item :labelCol="labelColLong" :wrapperCol="wrapperColLong" prop="requestBody" label="请求体">
            <a-textarea v-model="model.requestBody" :rows="4" readonly />
          </a-form-model-item>
        </a-row>
        <a-row>
          <a-form-model-item :labelCol="labelColLong" :wrapperCol="wrapperColLong" prop="responseBody" label="响应体">
            <a-textarea v-model="model.responseBody" :rows="4" readonly />
          </a-form-model-item>
        </a-row>
        <a-row>
          <a-form-model-item :labelCol="labelColLong" :wrapperCol="wrapperColLong" prop="method"
                             label="调用方法">
            <a-textarea v-model="model.method" :rows="1" readonly />
          </a-form-model-item>
        </a-row>
      </a-form-model>
    </a-spin>
  </j-modal>
</template>
<script>
import { httpAction } from '@/api/manage'
import moment from 'moment'
export default {
  name: 'SysApiLogModal',
  data() {
    return {
      title: '操作',
      visible: false,
      disableSubmit: true,
      model: {},
      labelCol: {
        xs: { span: 24 },
        sm: { span: 6 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      },
      labelColLong: {
        xs: { span: 24 },
        sm: { span: 3 }
      },
      wrapperColLong: {
        xs: { span: 24 },
        sm: { span: 20 }
      },
      confirmLoading: false,
      validatorRules: {},
      url: {
        add: '/system/sysApiLog/add',
        edit: '/system/sysApiLog/edit'
      }
    }
  },
  created() {
  },
  methods: {
    add() {
      //初始化默认值
      this.edit({})
    },
    edit(record) {
      this.model = Object.assign({}, record)
      this.visible = true
    },
    close() {
      this.$emit('close')
      this.visible = false
      this.$refs.form.clearValidate()
    },
    handleOk() {
      const that = this
      // è§¦å‘表单验证
      this.$refs.form.validate(valid => {
        if (valid) {
          that.confirmLoading = true
          let httpurl = ''
          let method = ''
          if (!this.model.id) {
            httpurl += this.url.add
            method = 'post'
          } else {
            httpurl += this.url.edit
            method = 'put'
          }
          httpAction(httpurl, this.model, method).then((res) => {
            if (res.success) {
              that.$message.success(res.message)
              that.$emit('ok')
            } else {
              that.$message.warning(res.message)
            }
          }).finally(() => {
            that.confirmLoading = false
            that.close()
          })
        } else {
          return false
        }
      })
    },
    handleCancel() {
      this.close()
    }
  }
}
</script>
<style lang="less" scoped>
</style>
src/views/system/modules/UserModal.vue
@@ -136,40 +136,55 @@
        </a-form-model-item>
        <!--车间分配-->
<!--        <a-form-model-item-->
<!--          label="车间分配"-->
<!--          :labelCol="labelCol"-->
<!--          :wrapperCol="wrapperCol"-->
<!--          v-show="!productionDisabled"-->
<!--        >-->
<!--          <j-select-production-->
<!--            v-model="model.selectedProduction"-->
<!--            :multi="true"-->
<!--            @back="backProductionInfo"-->
<!--            :backProduction="true"-->
<!--            :treeProductOpera="true"-->
<!--          ></j-select-production>-->
<!--        </a-form-model-item>-->
        <!--中心分配-->
        <a-form-model-item
          label="车间分配"
          label="中心分配"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          v-show="!productionDisabled"
          v-show="!factoryDisabled"
        >
          <j-select-production
            v-model="model.selectedProduction"
          <j-select-factory
            v-model="model.selectedFactorys"
            :multi="true"
            @back="backProductionInfo"
            :backProduction="true"
            :treeProductOpera="true"
          ></j-select-production>
            @back="backFactoryInfo"
            :backFactory="true"
            :treeFactoryOpera="true"
          ></j-select-factory>
        </a-form-model-item>
        <a-form-model-item
          label="选择设备"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          v-show="!productionDisabled"
        >
          <a-tooltip title="选择设备后,用户就只有这些设备的权限!不选择设备,则会根据车间分配控制设备的权限!"
                     placement="topRight">
            <a-input-search
              :readOnly="true"
              v-model="model.equipmentIds"
              @search="deviceSearch"
              enter-button
              placeholder="请选择设备"
              :disabled="!model.selectedProduction"
            />
          </a-tooltip>
        </a-form-model-item>
<!--        <a-form-model-item-->
<!--          label="选择设备"-->
<!--          :labelCol="labelCol"-->
<!--          :wrapperCol="wrapperCol"-->
<!--          v-show="!productionDisabled"-->
<!--        >-->
<!--          <a-tooltip title="选择设备后,用户就只有这些设备的权限!不选择设备,则会根据车间分配控制设备的权限!"-->
<!--                     placement="topRight">-->
<!--            <a-input-search-->
<!--              :readOnly="true"-->
<!--              v-model="model.equipmentIds"-->
<!--              @search="deviceSearch"-->
<!--              enter-button-->
<!--              placeholder="请选择设备"-->
<!--              :disabled="!model.selectedProduction"-->
<!--            />-->
<!--          </a-tooltip>-->
<!--        </a-form-model-item>-->
        <!--<a-form-model-item-->
@@ -356,7 +371,7 @@
import { addUser, editUser, queryUserRole, queryall } from '@/api/api'
import { disabledAuthFilter } from '@/utils/authFilter'
import { duplicateCheck } from '@/api/api'
import JSelectProduction from '../../../components/jeecgbiz/JSelectProduction'
import JSelectFactory from '../../../components/jeecgbiz/JSelectFactory'
import { mapActions } from 'vuex'
import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api'
import SelectDeviceModal from './SelectDeviceModal'
@@ -365,12 +380,12 @@
  name: 'UserModal',
  components: {
    SelectDeviceModal,
    JSelectProduction
    JSelectFactory
  },
  data() {
    return {
      departDisabled: false, //是否是我的部门调用该页面
      productionDisabled: false, //是否是我的车间调用该页面
      factoryDisabled: false, //是否是我的车间调用该页面
      roleDisabled: false, //是否是角色维护调用该页面
      modalWidth: 800,
      drawerWidth: 700,
@@ -404,7 +419,6 @@
      departIdShow: false,
      title: '操作',
      visible: false,
      model: {},
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 }
@@ -420,7 +434,7 @@
        fileUpload: window._CONFIG['domianURL'] + 'sys/common/upload',
        userWithDepart: '/sys/user/userDepartList', // å¼•入为指定用户查看部门信息需要的url
        //引入为指定用户查看车间信息需要的url
        userProductionList: '/sys/user/userProductionList',
        userFactoryList: '/sys/user/userFactorysList',
        userId: '/sys/user/generateUserId', // å¼•入生成添加用户情况下的url
        syncUserByUserName: '/act/process/extActProcess/doSyncUserByUserName',//同步用户到工作流
        queryTenantList: '/sys/tenant/queryList'
@@ -428,10 +442,10 @@
      tenantsOptions: [],
      rolesOptions: [],
      nextDepartOptions: [],
      nextProductionOptions: [],
      nextFactoryOptions: [],
      isDepartType: '',
      model: {
        selectedProduction: ''
        selectedFactorys: ''
      }
    }
  },
@@ -441,7 +455,7 @@
        if (value) this.initDictData('password_length')
      }
    },
    'model.selectedProduction': {
    'model.selectedFactorys': {
      handler(newVal, oldVal) {
        if (newVal && this.$refs.selectDeviceModal) {
          // å¦‚果车间选择前后不一致则重置选择设备
@@ -489,7 +503,7 @@
        userIdentity: 1,
        selectedroles: '',
        selecteddeparts: '',
        selectedProduction: ''
        selectedFactorys: ''
      })
    },
    edit(record) {
@@ -510,6 +524,7 @@
      if (record.hasOwnProperty('id')) {
        that.getUserRoles(record.id)
        that.getUserDeparts(record.id)
        that.getUserFactorys(record.id)
      }
    },
    isDisabledAuth(code) {
@@ -582,26 +597,27 @@
          that.nextDepartOptions = departOptions
        }
      })
    },
    getUserFactorys(userid) {
      let that = this
      // èŽ·å–è½¦é—´åˆ†é…
      getAction(that.url.userProductionList, { userId: userid }).then((res) => {
      getAction(that.url.userFactoryList, { userId: userid }).then((res) => {
        if (res.success) {
          let ProductionOptions = []
          let selectProductKeys = []
          let factoryOptions = []
          let selectFactoryKeys = []
          for (let i = 0; i < res.result.length; i++) {
            selectProductKeys.push(res.result[i].key)
            selectFactoryKeys.push(res.result[i].key)
            //新增负责部门选择下拉框
            ProductionOptions.push({
            factoryOptions.push({
              value: res.result[i].key,
              label: res.result[i].title
            })
          }
          this.$set(this.model, 'selectedProduction', selectProductKeys.join(','))
          that.nextProductionOptions = ProductionOptions
          this.$set(this.model, 'selectedFactorys', selectFactoryKeys.join(','))
          that.nextFactoryOptions = factoryOptions
        }
      })
      //车间的url
    },
    backDepartInfo(info) {
      this.model.departIds = this.model.selecteddeparts
@@ -610,9 +626,9 @@
        return c
      })
    },
    backProductionInfo(info) {
      this.model.productionIds = this.model.selectedProduction
      this.nextProductionOptions = info.map((item, index, arr) => {
    backFactoryInfo(info) {
      this.model.productionIds = this.model.selectedFactorys
      this.nextFactoryOptions = info.map((item, index, arr) => {
        let c = { label: item.text, value: item.value + '' }
        return c
      })
@@ -621,7 +637,7 @@
    refresh() {
      this.userId = ''
      this.nextDepartOptions = []
      this.nextProductionOptions = []
      this.nextFactoryOptions = []
      this.departIdShow = false
    },
    close() {
@@ -629,7 +645,7 @@
      this.visible = false
      this.disableSubmit = false
      this.nextDepartOptions = []
      this.nextProductionOptions = []
      this.nextFactoryOptions = []
      this.departIdShow = false
      this.$refs.form.resetFields()
    },