基于Jeecgboot前后端分离的ERP系统开发系列--出库单(3)

简介: 基于Jeecgboot前后端分离的ERP系统开发系列--出库单(3)

继续对销售出库单进行完善与处理

一、列表显示状态

    目前先给出库表单两种状态,未审核与审核通过状态,前端通过下面调整

{
            title:'状态',
            align:"center",
            dataIndex: 'status',
            customRender:function (text) {
              if(text==1){
                return "未审核";
              }else if(text==2){
                return "审核通过";
              }else{
                return text;
              }
            }  
          },

二、对按钮显示进行处理,已经审核的表单只显示详情

<span slot="action" slot-scope="text, record">
          <a @click="handleDetail(record)">详情</a>
          <a-divider type="vertical" />
          <a v-if="record.status != 2" @click="handleEdit(record)">编辑</a>
          <a-divider type="vertical" />
          <a v-if="record.status != 2" @click="handleApprove(record)">审核</a>
          <a-divider type="vertical" />
          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
            <a v-if="record.status != 2">删除</a>
          </a-popconfirm>
        </span>

三、对批量删除进行处理,有审核的单据不能进行删除,对NbcioListMixin里的下面函数修改如下

batchDel: function () {
      if(!this.url.deleteBatch){
        this.$message.error("请设置url.deleteBatch属性!")
        return
      }
      if (this.selectedRowKeys.length <= 0) {
        this.$message.warning('请选择一条记录!');
        return;
      } else {
        var ids = "";
        for (var a = 0; a < this.selectedRowKeys.length; a++) {
          ids += this.selectedRowKeys[a] + ",";
          if(this.selectionRows[a].hasOwnProperty('status') && this.selectionRows[a].status === 2) {
            this.$message.warning(`第${a+1}行单据已经审核,不能删除!`)
            return
          }
        }

四、因为审核单据界面与编辑单据界面使用相同的窗口,所以需要做一些逻辑处理

1、首先ErpSaleOutModal文件进行调整如下

审核与编辑分开处理,同时增加两个变量okText和approve,增加一个handleApprove函数

<template>
  <j-modal v-if = "approve"
  :title="title"
    :width="1200"
    :okText="okText"
    :visible="visible"
    :maskClosable="false"
    switchFullscreen
    @ok="handleApprove"
    @cancel="handleCancel">
    <erp-sale-out-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"/>
  </j-modal>
  <j-modal v-else
    :title="title"
    :width="1200"
    :visible="visible"
    :maskClosable="false"
    switchFullscreen
    @ok="handleOk"
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @cancel="handleCancel">
    <erp-sale-out-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"/>
  </j-modal>
</template>
<script>
  import ErpSaleOutForm from './ErpSaleOutForm'
  export default {
    name: 'ErpSaleOutModal',
    components: {
      ErpSaleOutForm
    },
    data() {
      return {
        title:'',
        width:800,
        visible: false,
        disableSubmit: false,
        okText: "确定",
        approve: false,//审核
      }
    },
    methods:{
      add () {
        this.visible=true
        this.$nextTick(()=>{
          this.$refs.realForm.add();
        })
      },
      edit (record) {
        this.visible=true
        this.$nextTick(()=>{
          this.$refs.realForm.edit(record);
        })
      },
      close () {
        this.$emit('close');
        this.visible = false;
      },
      handleOk () {
        this.$refs.realForm.handleOk();
      },
      handleApprove () {
        this.$refs.realForm.handleApprove();
      },
      submitCallback(){
        this.$emit('ok');
        this.visible = false;
      },
      handleCancel () {
        this.close()
      }
    }
  }
</script>
<style scoped>
</style>

2、在ErpSaleOutForm增加审核的url如下:

url: {
          add: "/sale/erpSaleOut/add",
          edit: "/sale/erpSaleOut/edit",
          approvePass:"/sale/erpSaleOut/approvePass",

3、NbcioListMixin里的handleApprove加入下面代码

handleApprove:function(record){
      if(record.status === 2) {
        this.$message.warning("单据已经审核,不能再次审核!")
        return
      }
      this.$refs.modalForm.approve=true;
      this.$refs.modalForm.edit(record);
      this.$refs.modalForm.title="审核详情";
      this.$refs.modalForm.okText="审核通过"
      this.$refs.modalForm.disableSubmit = true;
    },

同时对增加,新建处理需要设置this.$refs.modalForm.approve=false;

4、同时在NbcioTableModelMixin下面增加下面代码

/** 审核通过按钮点击事件 */
    handleApprove() {
      let url = this.url.approvePass, method = 'post'
      console.log("handleApprove this.model.id=",this.model.id)
      this.confirmLoading = true
      httpAction(url, this.model.id, method).then((res) => {
        if (res.success) {
          this.$message.success(res.message)
          this.$emit('ok')
          this.close()
        } else {
          this.$message.warning(res.message)
        }
      }).finally(() => {
        this.confirmLoading = false
      })
    },

五、后端调用审核通过代码

/**
   *   审核
   *
   * @param id
   * @return
   * @throws Exception 
   */
  @AutoLog(value = "销售出库单-审核通过")
  @ApiOperation(value="销售出库单-审核通过", notes="销售出库单-审核通过")
  @PostMapping(value = "/approvePass")
  public Result<?> approvePass(@RequestBody String id) throws Exception {
    return erpSaleOutService.approvePass(id);
  }
@Override
  @Transactional(rollbackFor = Exception.class)
  public Result<?> approvePass(String id) throws Exception {
    ErpSaleOut erpSaleOut = erpSaleOutMapper.selectById(id);
    if (erpSaleOut == null) {
      return Result.error("销售出库单不存在!");
    }
    if (erpSaleOut.getStatus() == 2 ) {
      return Result.error("销售出库单已审核通过,不能再次审核!");
    }
    SysUser loginUser = iErpThirdService.getLoginUser();
    LambdaUpdateWrapper<ErpSaleOut> updateOrderWrapper = Wrappers.lambdaUpdate(ErpSaleOut.class)
            .set(ErpSaleOut::getApproveBy, loginUser.getUsername())
            .set(ErpSaleOut::getApproveTime, LocalDateTime.now())
            .eq(ErpSaleOut::getId, erpSaleOut.getId());
    erpSaleOut.setStatus(2); //审核通过标志 2代表通过    
    if(erpSaleOutMapper.update(erpSaleOut, updateOrderWrapper) != 1) {
      return Result.error("销售出库单信息已过期,请刷新重试!");
    }
    Wrapper<ErpSaleOutDetail> queryDetailWrapper = Wrappers.lambdaQuery(ErpSaleOutDetail.class)
            .eq(ErpSaleOutDetail::getSheetId, erpSaleOut.getId())
            .orderByAsc(ErpSaleOutDetail::getOrderNo);
        List<ErpSaleOutDetail> details = erpSaleOutDetailService.list(queryDetailWrapper);
        for (ErpSaleOutDetail detail : details) {
          ErpGoodsStockVo erpGoodsStockVo = new ErpGoodsStockVo();
          erpGoodsStockVo.setScId(erpSaleOut.getScId());
          erpGoodsStockVo.setGoodsId(detail.getGoodsId());
          erpGoodsStockVo.setStockNum(detail.getOrderNum());
          erpGoodsStockVo.setTaxAmount(NumberUtil.mul(detail.getTaxPrice(), detail.getOrderNum()));
          erpGoodsStockVo.setUnTaxAmount(NumberUtil.mul(NumberUtil.calcUnTaxPrice(detail.getTaxPrice(), detail.getTaxRate()), detail.getOrderNum()));
          erpGoodsStockVo.setTaxPrice(detail.getTaxPrice());
          erpGoodsStockVo.setUnTaxPrice(NumberUtil.calcUnTaxPrice(detail.getTaxPrice(), detail.getTaxRate()));
          erpGoodsStockVo.setBizCode(erpSaleOut.getCode());
          erpGoodsStockVo.setBizDetailId(detail.getId());
          erpGoodsStockVo.setBizId(erpSaleOut.getId());
          erpGoodsStockVo.setBizType(GoodsStockType.SALE.getCode());
          erpGoodsStockService.outStock(erpGoodsStockVo);
        }
    return Result.OK("审核通过完成");
  }
@Override
  @Transactional(rollbackFor = Exception.class)
  public void outStock(ErpGoodsStockVo erpGoodsStockVo) throws Exception {
      Wrapper<ErpGoodsStock> queryWrapper = Wrappers.lambdaQuery(ErpGoodsStock.class)
              .eq(ErpGoodsStock::getGoodsId, erpGoodsStockVo.getGoodsId()).eq(ErpGoodsStock::getScId, erpGoodsStockVo.getScId());
  
      ErpGoodsStock outerpGoodsStock =  erpGoodsStockMapper.selectOne(queryWrapper);
      ErpGoodsStockLog erpGoodsStockLog = new ErpGoodsStockLog();
      if(outerpGoodsStock == null) {
      //第一次出库,新增记录
      outerpGoodsStock = new ErpGoodsStock();
      outerpGoodsStock.setScId(erpGoodsStockVo.getScId());
      outerpGoodsStock.setGoodsId(erpGoodsStockVo.getGoodsId());
      outerpGoodsStock.setStockNum(0-erpGoodsStockVo.getStockNum());
      outerpGoodsStock.setTaxPrice(erpGoodsStockVo.getTaxPrice());
      outerpGoodsStock.setTaxAmount(NumberUtil.sub(BigDecimal.ZERO, erpGoodsStockVo.getTaxAmount()));
      outerpGoodsStock.setUnTaxPrice(erpGoodsStockVo.getUnTaxPrice());
      outerpGoodsStock.setUnTaxAmount(NumberUtil.sub(BigDecimal.ZERO, erpGoodsStockVo.getUnTaxAmount()));
  
      erpGoodsStockMapper.insert(outerpGoodsStock);
      
      erpGoodsStockLog.setOriStockNum(0);
      erpGoodsStockLog.setOriUnTaxPrice(BigDecimal.ZERO);
      erpGoodsStockLog.setOriTaxPrice(BigDecimal.ZERO);
    }
    else {//已有库存数量金额更新
      LambdaUpdateWrapper<ErpGoodsStock> updateWrapper = Wrappers.lambdaUpdate(ErpGoodsStock.class)
              .eq(ErpGoodsStock::getScId, erpGoodsStockVo.getScId())
              .eq(ErpGoodsStock::getGoodsId, erpGoodsStockVo.getGoodsId());
      
      erpGoodsStockLog.setOriStockNum(outerpGoodsStock.getStockNum());
      erpGoodsStockLog.setOriUnTaxPrice(outerpGoodsStock.getUnTaxPrice());
      erpGoodsStockLog.setOriTaxPrice(outerpGoodsStock.getTaxPrice());
      outerpGoodsStock.setScId(erpGoodsStockVo.getScId());
      outerpGoodsStock.setGoodsId(erpGoodsStockVo.getGoodsId());
      outerpGoodsStock.setStockNum(outerpGoodsStock.getStockNum() - erpGoodsStockVo.getStockNum());
      if(outerpGoodsStock.getStockNum() == 0) {
        outerpGoodsStock.setTaxPrice(NumberUtil.div(NumberUtil.add(erpGoodsStockVo.getTaxPrice(),outerpGoodsStock.getTaxPrice()),2));
        outerpGoodsStock.setUnTaxPrice(NumberUtil.div(NumberUtil.add(erpGoodsStockVo.getUnTaxPrice(),outerpGoodsStock.getUnTaxPrice()),2));
        outerpGoodsStock.setTaxAmount(BigDecimal.ZERO);
        outerpGoodsStock.setUnTaxAmount(BigDecimal.ZERO);
      }
      else {
        outerpGoodsStock.setTaxAmount(NumberUtil.sub(erpGoodsStockVo.getTaxAmount(),outerpGoodsStock.getTaxAmount()));
        outerpGoodsStock.setUnTaxAmount(NumberUtil.sub(erpGoodsStockVo.getUnTaxAmount(),outerpGoodsStock.getUnTaxAmount()));
        outerpGoodsStock.setTaxPrice(NumberUtil.div(outerpGoodsStock.getTaxAmount(), outerpGoodsStock.getStockNum()));
        outerpGoodsStock.setUnTaxPrice(NumberUtil.div(outerpGoodsStock.getUnTaxAmount(), outerpGoodsStock.getStockNum()));
      }
      
      if(erpGoodsStockMapper.update(outerpGoodsStock, updateWrapper) != 1) {
        throw new Exception("出库更新信息已过期,请刷新重试!");
      }
    }
    erpGoodsStockLog.setGoodsId(erpGoodsStockVo.getGoodsId());
    erpGoodsStockLog.setScId(erpGoodsStockVo.getScId());
    erpGoodsStockLog.setStockNum(erpGoodsStockVo.getStockNum());
    erpGoodsStockLog.setTaxAmount(erpGoodsStockVo.getTaxAmount());
    erpGoodsStockLog.setUnTaxAmount(erpGoodsStockVo.getUnTaxAmount());
    erpGoodsStockLog.setCurStockNum(outerpGoodsStock.getStockNum());
    erpGoodsStockLog.setStockNum(outerpGoodsStock.getStockNum());
    erpGoodsStockLog.setCurTaxPrice(outerpGoodsStock.getTaxPrice());
    erpGoodsStockLog.setCurUnTaxPrice(outerpGoodsStock.getUnTaxPrice());
    erpGoodsStockLog.setBizCode(erpGoodsStockVo.getBizCode());
    erpGoodsStockLog.setBizDetailId(erpGoodsStockVo.getBizDetailId());
    erpGoodsStockLog.setBizId(erpGoodsStockVo.getBizId());
    erpGoodsStockLog.setBizType(erpGoodsStockVo.getBizType());
  
    erpGoodsStockLogService.save(erpGoodsStockLog);
  }

六、效果图:


相关文章
|
11天前
|
消息中间件 缓存 JavaScript
如何开发ERP(离散制造-MTO)系统中的生产管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO模式下的ERP生产管理模块,涵盖核心问题、系统架构、关键流程、开发技巧及数据库设计,助力企业打通计划与执行“最后一公里”,提升交付率、降低库存与浪费。
|
14天前
|
消息中间件 JavaScript 前端开发
如何开发ERP(离散制造-MTO)系统中的技术管理板块(附架构图+流程图+代码参考)
本文详解ERP(离散制造-MTO)系统中的技术管理板块,涵盖产品定义、BOM、工序、工艺文件及变更控制的结构化与系统化管理。内容包括技术管理的核心目标、总体架构、关键组件、业务流程、开发技巧与最佳实践,并提供完整的参考代码,助力企业将技术数据转化为可执行的生产指令,提升制造效率与质量。
|
14天前
|
消息中间件 JavaScript 关系型数据库
如何开发一套ERP(离散制造-MTO)系统(附架构图+流程图+代码参考)
本文介绍了面向离散制造-MTO(按订单生产)模式的ERP系统设计与实现方法。内容涵盖ERP系统定义、总体架构设计、主要功能模块解析、关键业务流程(订单到交付、BOM展开、MRP逻辑、排产等)、开发技巧(DDD、微服务、事件驱动)、参考代码示例、部署上线注意事项及实施效果评估。旨在帮助企业与开发团队构建高效、灵活、可扩展的ERP系统,提升订单交付能力与客户满意度。
|
3月前
|
人工智能 运维 安全
如何自己开发一套ERP系统?
本文探讨了企业自建ERP系统的可行性,分析了轻量、中型和重型ERP的区别,并指出自研ERP需明确业务需求、流程逻辑及投入成本。文章建议企业在决定自研前,应先梳理清楚管理逻辑,而非盲目追求技术方案。
|
3月前
|
SQL 存储 供应链
如何开发ERP系统中的库存管理板块(附架构图+流程图+代码参考)
本文介绍如何通过ERP系统实现企业库存管理的数字化与自动化,涵盖仓库管理、库位管理、出入库操作、库存调拨与盘点等功能设计,并提供开发技巧及代码参考,帮助企业提升库存管理效率,减少错误与资源浪费。
|
8天前
|
监控 供应链 前端开发
如何开发ERP(离散制造-MTO)系统中的财务管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO企业ERP系统中财务管理模块的搭建,聚焦应收账款与应付账款管理,涵盖核心功能、业务流程、开发技巧及Python代码示例,助力企业实现财务数据准确、实时可控,提升现金流管理能力。
|
8天前
|
供应链 监控 JavaScript
如何开发ERP(离散制造-MTO)系统中的库存管理板块(附架构图+流程图+代码参考)
本文详解MTO模式下ERP库存管理的关键作用,涵盖核心模块、业务流程、开发技巧与代码示例,助力制造企业提升库存周转率、降低缺货风险,实现高效精准的库存管控。
|
13天前
|
消息中间件 JavaScript BI
如何开发ERP(离散制造-MTO)系统中的客户管理板块(附架构图+流程图+代码参考)
本文详解离散制造-MTO模式下ERP系统客户管理模块的设计与实现,涵盖架构图、流程图、功能拆解、开发技巧及TypeScript参考代码,助力企业打通客户信息与报价、生产、交付全链路,提升响应效率与订单准交率。
|
13天前
|
JSON 前端开发 关系型数据库
如何开发ERP(离散制造-MTO)系统中的销售管理板块(附架构图+流程图+代码参考)
针对离散制造MTO模式,销售管理是业务核心入口,贯穿报价、订单、ATP、排产与交付。本文详解其架构设计、关键流程、数据模型及开发实践,助力企业提升交付准确率与运营效率。
|
3月前
|
SQL 数据挖掘 API
如何开发ERP系统中的质量管理板块(附架构图+流程图+代码参考)
质量管理在ERP系统中的作用不仅仅是记录质量检验数据,它还涉及到从物料采购、生产过程、到最终产品的全流程管理。如何搭建一个高效、可靠的质量管理板块,成为了许多企业在进行ERP系统开发时需要重点考虑的问题。本文将详细介绍如何开发ERP系统中的质量管理板块,涵盖功能模块、业务流程、开发技巧和实现效果等方面,并提供具体的代码参考。

热门文章

最新文章