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

一、列表显示状态

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

{
            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);
	}

六、效果图: