备案 控制台
开发者社区 开发与运维 文章 正文

基于jeecg前端实现从表ERP格式选择

简介: 基于jeecg前端实现从表ERP格式选择

在实际工作中需要类似ERP那样的从表物料选择界面,如下所示,

参考jeecg里的JEditableTable组件里的popup

增加

<!-- update-begin-author:nbacheng date:20220508 for:popupGoods -->
                    <template v-else-if="col.type === formTypes.popupGoods">
                      <a-tooltip
                        :key="i"
                        :id="id"
                        placement="top"
                        :title="(tooltips[id] || {}).title"
                        :visible="(tooltips[id] || {}).visible || false"
                        :autoAdjustOverflow="true"
                        :getPopupContainer="getParentContainer"
                      >
                        <span
                          <j-select-list
                            :rows="getPopupGoodsRows(row)"
                            :kind="col.kind"
                            :multi="col.multi"
                            :value="getPopupGoodsValue(id)"
                            @change="(v)=>handleChangePopupGoodsCommon(v,id,row,col,rowIndex)" />
                        </span>
                      </a-tooltip>
                    </template>
                    <!-- update-end-author:nbacheng date:20220508 for:popupGoods -->
JSelectList组件如下
<template>
  <div>
    <a-input-search v-if="kind === 'goods'" v-model="names" placeholder="请选择" @pressEnter="onPressEnter" @search="onSearch"></a-input-search>
    <j-select-goods-modal v-if="kind === 'goods'" ref="selectModal" :modal-width="modalWidth" :rows="rows" :multi="multi" :good-code="value" @ok="selectOK" @initComp="initComp"/>
  </div>
</template>
<script>
  import JSelectGoodsModal from './modal/JSelectGoodsModal'
  import Vue from 'vue'
  export default {
    name: 'JSelectList',
    components: {JSelectGoodsModal },
    props: {
      modalWidth: {
        type: Number,
        default: 1450,
        required: false
      },
      value: {
        type: String,
        required: false
      },
      disabled: {
        type: Boolean,
        required: false,
        default: false
      },
      rows: {
        type: String,
        required: false
      },
      kind: {
        type: String,
        required: false
      },
      multi: {
        type: Boolean,
        default: true,
        required: false
      }
    },
    data() {
      return {
        ids: "",
        names: "",
      }
    },
    mounted() {
      this.ids = this.value
    },
    watch: {
      value(val) {
        this.ids = val
      }
    },
    model: {
      prop: 'value',
      event: 'change'
    },
    methods: {
      initComp(name) {
        this.names = name
      },
      onPressEnter() {
        if(this.kind === 'goods') {
          this.$refs.selectModal.showModal()
        }  
      },
      onSearch() {
        if(this.kind === 'goods') {
          //直接进行弹窗
          this.$refs.selectModal.showModal(this.names)
        } else {
          this.$refs.selectModal.showModal()
        }
      },
      selectOK(rows, idstr) {
        console.log("选中商品id", idstr)
        if (!rows) {
          this.ids = ''
        } else {
          this.names = idstr
          this.ids = idstr
        }
        this.$emit("change", this.ids)
      }
    }
  }
</script>
<style scoped>
</style>
JSelectGoodsModal组件如下
<template>
  <a-modal
    :width="modalWidth"
    :visible="visible"
    :title="title"
    @ok="handleSubmit"
    @cancel="close"
    cancelText="关闭"
    style="top:5%;height: 100%;overflow-y: hidden"
    wrapClassName="ant-modal-cust-warp"
  >
    <a-row :gutter="10" style="padding: 10px; margin: -10px">
      <a-col :md="24" :sm="24">
        <!-- 查询区域 -->
        <div class="table-page-search-wrapper">
          <!-- 搜索区域 -->
          <a-form layout="inline" @keyup.enter.native="onSearch">
            <a-row :gutter="24">
              <a-col :md="6" :sm="8">
                <a-form-item label="商品" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
                  <a-input ref="goods" placeholder="名称" v-model="queryParam.q"></a-input>
                </a-form-item>
              </a-col>
              <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
                <a-col :md="6" :sm="24">
                  <a-button type="primary" @click="loadGoodsData(1)">查询</a-button>
                  <a-button style="margin-left: 8px" @click="searchReset(1)">重置</a-button>
                </a-col>
              </span>
            </a-row>
          </a-form>
          <a-table
            ref="table"
            :scroll="scrollTrigger"
            size="middle"
            rowKey="id"
            :columns="columns"
            :dataSource="dataSource"
            :pagination="ipagination"
            :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,type: getType}"
            :loading="loading"
            :customRow="rowAction"
            @change="handleTableChange">
            <template slot="customRenderEnableSerialNumber" slot-scope="enableSerialNumber">
              <a-tag v-if="enableSerialNumber==1" color="green">有</a-tag>
              <a-tag v-if="enableSerialNumber==0" color="orange">无</a-tag>
            </template>
            <template slot="customRenderEnableBatchNumber" slot-scope="enableBatchNumber">
              <a-tag v-if="enableBatchNumber==1" color="green">有</a-tag>
              <a-tag v-if="enableBatchNumber==0" color="orange">无</a-tag>
            </template>
          </a-table>
        </div>
      </a-col>
    </a-row>
  </a-modal>
</template>
<script>
  import { httpAction, getAction } from '@/api/manage'
  import {filterObj} from '@/utils/util'
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  import Vue from 'vue'
  export default {
    name: 'JSelectGoodsModal',
    mixins:[JeecgListMixin],
    components: {},
    props: ['modalWidth', 'rows', 'multi', 'goodCode'],
    data() {
      return {
        queryParam: {
          q: ''
        },
        labelCol: {
          xs: { span: 24 },
          sm: { span: 5 },
        },
        wrapperCol: {
          xs: { span: 24 },
          sm: { span: 16 },
        },
        categoryTree:[],
        columns: [
          {dataIndex: 'code', title: '编码'},
          {dataIndex: 'name', title: '名称'},
          {dataIndex: 'price', title: '价格'},
          {dataIndex: 'chucDate', title: '出厂时间'},    
        ],
        scrollTrigger: {},
        dataSource: [],
        selectedRowKeys: [],
        selectGoodsRows: [],
        selectGoodsIds: [],
        title: '选择商品',
        ipagination: {
          current: 1,
          pageSize: 10,
          pageSizeOptions: ['10', '20', '30'],
          showTotal: (total, range) => {
            return range[0] + '-' + range[1] + ' 共' + total + '条'
          },
          showQuickJumper: true,
          showSizeChanger: true,
          total: 0
        },
        isorter: {
          column: 'createTime',
          order: 'desc'
        },
        visible: false,
        form: this.$form.createForm(this),
        loading: false,
        expandedKeys: [],
        disableMixinCreated: true,
        goodsType: [],
        url: {
          goodslist: "/test/cesShopGoods/list", 
          categorylist: "/test/cesShopType/rootList",
        },
      }
    },
    computed: {
      // 计算属性的 getter
      getType: function () {
        return this.multi == true ? 'checkbox' : 'radio';
      }
    },
    watch: {
      goodCode: {
        immediate: true,
        handler() {
          this.initcode()
        }
      },
    },
    created() {
      // 该方法触发屏幕自适应
      this.resetScreenSize()
    },
    methods: {
      initcode() {
        if (this.goodCode) {
          this.$emit('initComp', this.goodCode)
        } else {
          // JSelectUserByDep组件bug issues/I16634
          this.$emit('initComp', '')
        }
      },
      loadGoodsData(arg) {
        if (arg === 1) {
          this.ipagination.current = 1;
        }
        this.loading = true
        let params = this.getQueryParams()//查询条件
        getAction(this.url.goodslist,params).then((res) => {
          if (res) {
            console.log("goodslist res.result = ",res.result);
            this.dataSource = res.result.records;
            this.ipagination.total = res.result.total;
            if(res.total ===1) {
              this.title = '选择商品【再次回车可以直接选中】'
              this.$nextTick(() => this.$refs.goods.focus());
            } else {
              this.title = '选择商品'
            }
          }
        }).finally(() => {
          this.loading = false
        })
      },
      // 触发屏幕自适应
      resetScreenSize() {
        let screenWidth = document.body.clientWidth;
        if (screenWidth < 500) {
          this.scrollTrigger = {x: 800};
        } else {
          this.scrollTrigger = {};
        }
      },
      showModal(goodCode) {
        this.visible = true;
        this.title = '选择商品'
        this.queryParam.q = goodCode;
        this.$nextTick(() => this.$refs.goods.focus());
        this.loadGoodsData();
        this.form.resetFields();
      },
      getQueryParams() {
        let param = Object.assign({}, this.queryParam, this.isorter);
        param.page = this.ipagination.current;
        param.rows = this.ipagination.pageSize;
        return filterObj(param);
      },
      getQueryField() {
        let str = 'id,';
        for (let a = 0; a < this.columns.length; a++) {
          str += ',' + this.columns[a].dataIndex;
        }
        return str;
      },
      searchReset(num) {
        let that = this;
        if (num !== 0) {
          that.queryParam = {};
          that.loadGoodsData(1);
        }
        that.selectedRowKeys = [];
        that.selectGoodsIds = [];
      },
      close() {
        this.searchReset(0);
        this.visible = false;
      },
      handleTableChange(pagination, filters, sorter) {
        if (Object.keys(sorter).length > 0) {
          this.isorter.column = sorter.field;
          this.isorter.order = 'ascend' === sorter.order ? 'asc' : 'desc';
        }
        this.ipagination = pagination;
        this.loadGoodsData();
      },
      handleSubmit() {
        let that = this;
        this.getSelectGoodsRows();
        that.$emit('ok', that.selectGoodsRows, that.selectGoodsIds);
        that.searchReset(0)
        that.close();
      },
      //获取选择信息
      getSelectGoodsRows(rowId) {
        let dataSource = this.dataSource;
        console.log("getSelectGoodsRows datasource=",dataSource);
        let goodsIds = "";
        this.selectGoodsRows = [];
        for (let i = 0, len = dataSource.length; i < len; i++) {
          if (this.selectedRowKeys.includes(dataSource[i].id)) {
            this.selectGoodsRows.push(dataSource[i]);
            goodsIds = goodsIds + "," + dataSource[i].code;
          }
        }
        this.selectGoodsIds = goodsIds.substring(1);
        console.log("getSelectGoodsRows selectGoodsRows=",this.selectGoodsRows);
        console.log("getSelectGoodsRows selectGoodsIds=",this.selectGoodsIds);
      },
      onSelectChange(selectedRowKeys, selectionRows) {
        this.selectedRowKeys = selectedRowKeys;
        this.selectionRows = selectionRows;
      },
      onSearch() {
        if(this.dataSource && this.dataSource.length===1) {
          if(this.queryParam.q === this.dataSource[0].code||
            this.queryParam.q === this.dataSource[0].name||
            this.queryParam.q === this.dataSource[0].price||
            this.queryParam.q === this.dataSource[0].chuc_date) {
            let arr = []
            arr.push(this.dataSource[0].id)
            this.selectedRowKeys = arr
            this.handleSubmit()
          } else {
            this.loadMaterialData(1)
          }
        } else {
          this.loadMaterialData(1)
        }
      },
      modalFormOk() {
        this.loadMaterialData()
      },
      rowAction(record, index) {
        return {
          on: {
            click: () => {
              let arr = []
              arr.push(record.id)
              this.selectedRowKeys = arr
            },
            dblclick: () => {
              let arr = []
              arr.push(record.id)
              this.selectedRowKeys = arr
              this.handleSubmit()
            }
          }
        }
      }
    }
  }
</script>
<style scoped>
  .ant-table-tbody .ant-table-row td {
    padding-top: 10px;
    padding-bottom: 10px;
  }
  #components-layout-demo-custom-trigger .trigger {
    font-size: 18px;
    line-height: 64px;
    padding: 0 24px;
    cursor: pointer;
    transition: color .3s;
  }
</style>


宁波阿成.
目录
相关文章
猿大师
|
18天前
|
Web App开发 JavaScript 前端开发
网页VUE纯前端在线预览编辑Office,支持doc/docx、xls/xlsx、ppt/pptx、pdf等格式
随着互联网技术的不断发展,越来越多的企业开始采用在线办公模式,微软Office Word 是最好用的文档编辑工具,然而doc、docx、xls、xlsx、ppt、pptx等格式的Office文档是无法直接在浏览器中直接打开的,如果可以实现Web在线预览编辑OffIce,肯定会还带来了更高效、便捷的办公体验,为我们的工作带来了更多可能性。
猿大师
692 0
宁波阿成.
|
18天前
|
移动开发 前端开发
nbcio-boot基于jeecg的flowable支持部门经理的单个或多实例支持(前端部分)
nbcio-boot基于jeecg的flowable支持部门经理的单个或多实例支持(前端部分)
宁波阿成.
19 1
东风微鸣技术博客
|
18天前
|
前端开发 JavaScript Unix
前端常用的时间格式配置格式
前端常用的时间格式配置格式
东风微鸣技术博客
147 0
你挚爱的强哥
|
18天前
|
前端开发 JavaScript
前端用原生js编辑文件内容→创建生成文件(格式可以自定义)→下载文件
前端用原生js编辑文件内容→创建生成文件(格式可以自定义)→下载文件
你挚爱的强哥
60 0
锅盖哒
|
8月前
|
前端开发 定位技术
前端将UTC时间格式转化为本地时间格式~~uniapp写法
前端将UTC时间格式转化为本地时间格式~~uniapp写法
锅盖哒
71 0
七镜
|
8月前
|
前端开发
【前端】从markdown格式文本中提取图片链接
【前端】从markdown格式文本中提取图片链接
七镜
68 0
前端歌谣
|
10月前
|
前端开发
前端学习笔记202305学习笔记第二十天-vue3.0-通过作用域插槽的渲染格式
前端学习笔记202305学习笔记第二十天-vue3.0-通过作用域插槽的渲染格式
前端歌谣
35 0
前端歌谣
|
前端开发
前端学习笔记202303学习笔记第三天-Vue3.0-url-loader的loader格式
前端学习笔记202303学习笔记第三天-Vue3.0-url-loader的loader格式
前端歌谣
46 0
前端歌谣
|
前端开发
前端学习笔记202303学习笔记第三天-Vue3.0-url-loader的loader格式
前端学习笔记202303学习笔记第三天-Vue3.0-url-loader的loader格式
前端歌谣
46 0
前端歌谣
|
前端开发
前端项目实战191-ant design设置默认日期得时间格式
前端项目实战191-ant design设置默认日期得时间格式
前端歌谣
130 0

热门文章

最新文章

  • 1
    优酷中后台前端解决方案-总览
  • 2
    前端常见兼容问题系列6: 一些安卓APP的WebView中<input type="file">不工作
  • 3
    前端这条路怎么走,作为一名后端er,说说我的见解
  • 4
    利用String.format()使数字最前端自动补零
  • 5
    在VSCode中 使用 ESLint + Prettier检查代码规范及自动格式化前端Vue代码
  • 6
    js实现按键精灵——尝试前端实现自动化测试(一)上
  • 7
    细讲前端设置cookie, 储存用户登录信息
  • 8
    简单编译器前端的实现
  • 9
    web前端socket封装库--giraffe
  • 10
    Koala – 开源的前端预处理器语言图形编译工具
  • 1
    借助chat-web前端开源项目搭建属于自己的ChatGPT镜像站
    222
  • 2
    构建高性能Web应用:前端性能优化的关键策略与实践
    137
  • 3
    构建响应式Web界面:现代前端开发的最佳实践
    88
  • 4
    前端开发中的响应式设计与移动优先原则
    40
  • 5
    探索现代Web应用中的微前端架构
    39
  • 6
    前端性能优化实践:从理论到实际操作
    38
  • 7
    构建高效前端项目:模块化与组件化策略
    42
  • 8
    前端发展趋势:WebAssembly、PWA 和响应式设计
    39
  • 9
    前端开发新趋势:Web3、区块链和虚拟现实
    48
  • 10
    架构的未来:微前端与微服务的融合
    81
  • 相关课程

    更多
  • 网站性能前端监控课程
  • 移动Web前端开发
  • Ajax 前端开发入门与实战
  • 零基础学前端HTML+CSS
  • 前端开发CSS基础
  • 前端开发框架Bootstrap使用教程
  • 相关电子书

    更多
  • Vue.js 在前端服务化上的探索与实践
  • 阿里文娱大前端技术实践
  • 前端代码是怎样智能生成的
  • 相关实验场景

    更多
  • 前端开发基础3:CSS3常见显示属性
  • 前端开发基础6:Node.js和LESS预编译工具
  • 前端开发基础2:VS Code和Edge的联动开发
  • 前端开发基础1:前端开发环境的安装和配置
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司吕梁高端网站设计公司长葛如何制作网站公司坑梓关键词按天收费多少钱成都外贸网站设计多少钱保山模板制作哪家好伊犁SEO按天收费多少钱坂田优秀网站设计公司宁波网站设计报价桂林百度爱采购多少钱黑河网站开发公司广元网站seo优化诸城网站设计报价滨州英文网站建设哪家好泰州建网站长沙百度竞价鹰潭SEO按天计费价格宁德网站制作推荐自贡网站开发推荐张家界网站推广系统公司廊坊网站优化多少钱凉山百度网站优化推荐海南建网站推荐乐山网页设计哪家好吉安营销型网站建设哪家好清徐百姓网标王推广多少钱吉安关键词排名包年推广报价吉安网站优化排名价格垦利网站优化按天扣费推荐黄冈网络营销邵阳外贸网站建设报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化