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

六、效果图:


相关文章
|
5天前
|
移动开发 供应链 前端开发
基于jeecgboot的ERP部分演示功能发布
基于jeecgboot的ERP部分演示功能发布
10 0
|
5天前
|
数据库
基于Jeecgboot前后端分离的ERP系统开发代码生成(六)
基于Jeecgboot前后端分离的ERP系统开发代码生成(六)
|
5天前
|
JavaScript 前端开发
基于Jeecgboot前后端分离的ERP系统开发系列--出库单(2)
基于Jeecgboot前后端分离的ERP系统开发系列--出库单(2)
|
5天前
|
监控 供应链 物联网
ERP系统中的在制品管理与工艺路线规划
ERP系统中的在制品管理与工艺路线规划
51 2
|
5天前
|
数据采集 监控 供应链
ERP系统在大型企业中的实施案例研究
ERP系统在大型企业中的实施案例研究
51 0
|
5天前
|
安全
选择最佳供应商:ERP系统的供应商选择与评估方法论
选择最佳供应商:ERP系统的供应商选择与评估方法论
101 0
|
5天前
|
存储 自然语言处理 Oracle
打造全球化企业:ERP系统的国际化与多语言支持
打造全球化企业:ERP系统的国际化与多语言支持
50 2
|
5天前
|
安全 虚拟化 数据安全/隐私保护
比较本地部署与私有云方案:选择适合你的ERP系统
比较本地部署与私有云方案:选择适合你的ERP系统
105 2
|
5天前
|
存储 供应链 Oracle
探究ERP系统的云端部署与SaaS模式
探究ERP系统的云端部署与SaaS模式
84 0
|
5天前
|
数据可视化 BI
探索ERP系统的移动端应用与移动办公解决方案
探索ERP系统的移动端应用与移动办公解决方案
35 2