基于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);
  }

六、效果图:


相关文章
|
3月前
|
运维 供应链 前端开发
开发一个 ERP
【9月更文第5天】开发一个 ERP (Enterprise Resource Planning) 系统是一项复杂的工程,涉及到多个业务流程的集成与优化。ERP 系统旨在帮助企业整合财务、人力资源、采购、销售、库存管理和生产计划等多个部门的数据,从而提高运营效率和决策质量。本文将带你一起体验从零开始开发一个简单的 ERP 系统,并通过示例代码来说明关键组件的设计与实现。
257 3
|
3月前
|
前端开发 JavaScript 关系型数据库
如何开发一个ERP系统:从零开始构建
【9月更文第4天】企业资源计划(ERP)系统是现代企业管理不可或缺的一部分,它集成了公司的关键业务流程,并提供了统一的数据管理平台。本文将探讨如何从零开始构建一个简单的ERP系统,并提供一些基本的代码示例来演示关键组件的开发过程。
869 3
|
7月前
|
移动开发 供应链 前端开发
基于jeecgboot的ERP部分演示功能发布
基于jeecgboot的ERP部分演示功能发布
133 0
|
7月前
|
数据库
基于Jeecgboot前后端分离的ERP系统开发代码生成(六)
基于Jeecgboot前后端分离的ERP系统开发代码生成(六)
464 0
|
5天前
|
监控 JavaScript 数据可视化
实施模切ERP系统,为模切企业带来哪些效益
在众多制造企业中,工厂的日常运营依旧依赖于人工管理,导致生产效率低、反应慢、容易出错。 1、急单交期短、订单频繁变更怎么办? 2、物料、半成品如何及时跟上生产? 3、 客户验厂,品质质量如何追溯? 4、机台信息不清楚,时间配置情况不确定?
24 2
|
5月前
|
存储 安全 数据安全/隐私保护
ERP系统的灾备与数据恢复:保障企业业务连续性
【7月更文挑战第29天】 ERP系统的灾备与数据恢复:保障企业业务连续性
271 2
|
27天前
|
弹性计算 监控 数据库
制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程
本文通过一个制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程,展示了企业级应用上云的实践方法与显著优势,包括弹性计算资源、高可靠性、数据安全及降低维护成本等,为企业数字化转型提供参考。
52 5
|
1月前
|
人工智能 JavaScript 大数据
模切企业上点晴模切ERP系统是否合算
在模切行业快速发展的今天,企业如何提升管理效率、降低成本、增强市场竞争力成为了关键问题。面对市场上琳琅满目的模切ERP系统,点晴模切ERP在模切领域积累了20余年丰富的行业经验,能够提供贴合模切行业管理需求的先进解决方案。同时选择上点晴模切ERP系统是否理想选择,也成为众多模切企业关注的焦点。
31 8
|
5月前
|
数据采集 监控 Oracle
ERP系统的实施与变更管理:确保成功的数字化转型
【7月更文挑战第29天】 ERP系统的实施与变更管理:确保成功的数字化转型
358 0
|
2月前
|
供应链 JavaScript 数据挖掘
点晴模切ERP系统:模切行业管理创新的驱动力
模切企业在选择ERP管理系统的时间,一般都会了解点晴模切ERP。点晴模切ERP系统在解决模切管理痛点方面尤为突出,那么点晴模切ERP究竟是什么样的系统?我们一起来了解看看。
56 0