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

news2024/11/24 6:35:19

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

一、列表显示状态

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

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

六、效果图:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty(四):优化与源码

文章目录1. 优化1.1 扩展序列化算法1.2 参数调优1&#xff09;CONNECT_TIMEOUT_MILLIS2&#xff09;SO_BACKLOG3&#xff09;ulimit -n4&#xff09;TCP_NODELAY5&#xff09;SO_SNDBUF & SO_RCVBUF6&#xff09;ALLOCATOR7&#xff09;RCVBUF_ALLOCATOR1.3 RPC 框架1&…

IDEA性能优化设置(解决卡顿问题)修改内存

在我们日常使用IDEA进行开发时&#xff0c;可能会遇到许多卡顿的瞬间&#xff0c;明明我们的机器配置也不低啊&#xff1f;为什么就会一直卡顿呢&#xff1f; 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限&#xff08;通常很小&#xff09;&#xff0c;这就…

理解IM消息“可靠性”和“一致性”问题,以及解决方案探讨

试想如果一个IM连发出的消息都不知道对方到底能不能收到、发出的聊天内容对方看到的到底是不是“胡言乱语”&#xff08;严重乱序问题&#xff09;&#xff0c;这样的APP用户肯定不会让他在手机上过夜&#xff08;肯定第一时间卸载了&#xff09;&#xff0c;因为最基本的聊天逻…

python基础 | python基础语法

文章目录&#x1f4da;基础语法&#x1f407;输入和输出&#x1f955;print()输出&#x1f955;input()输入&#x1f407; 变量的命名&#x1f407;条件判断&#x1f955;单向判断&#x1f955;双向判断&#x1f955;多向判断&#x1f955;if嵌套&#x1f955;三元表达式&#…

漫画 | Python是一门烂语言?

这个电脑的主人是个程序员&#xff0c;他相继学习了C、Java、Python、Go&#xff0c; 但是似乎总是停留在Hello World的水平。 每天晚上&#xff0c;夜深人静的时候&#xff0c;这些Hello World程序都会热火朝天地聊天但是&#xff0c;这一天发生了可怕的事情随着各个Hello wor…

如何无报错运行代码YOLOv6,实现目标识别?

YOLOv6是由美团视觉团队开发的1.环境配置我们先把YOLOv6的代码clone下来git clone https://github.com/meituan/YOLOv6.git安装一些必要的包pip install pycocotools2.0作者要求pytorch的版本是1.8.0,我的环境是1.7.0&#xff0c;也是可以正常运行的pip install -r requirement…

RTOS之三裸机ADC转换与三轴加速计

参考&#xff1a;https://blog.csdn.net/qq_38427678/article/details/94607733各个pin口连接方式如下&#xff1a;// J1 J3 J4 J2// [ 1] [21] [40] [20]// [ 2] [22] [39] [19]// [ 3] [23] [38] [18]// [ 4] [24] [37] [17]// [ 5] [25] [36] [16]// [ 6] [26] [35] [15]// …

重温一下C#的时间类型,并简单写一个定时器功能

&#x1f389;&#x1f389; 时间是一个非常抽象的概念&#xff0c;本篇文章我们不深究目前电脑上的时候是如何保持全网同步。主要是讲讲在使用C#编程语言里的时间类型。最后使用定时任务简单写一个提醒功能&#xff0c;比如&#xff1a;每天10点准时打开一次csdn首页&#xff…

sk_buff结构体成员变量说明

一. 前言 Socket Buffer的数据包在穿越内核空间的TCP/IP协议栈过程中&#xff0c;数据内容不会被修改&#xff0c;只是数据包缓冲区中的协议头信息发生变化。大量操作都是围绕sk_buff结构体来进行的。 sk_buff结构的成员大致分为3类&#xff1a;结构管理域&#xff0c;常规数据…

cocos2d-x4.0 win10环境搭建

cocos2d-x默认只支持win32的版本&#xff0c;win64的我测试link不行 我搭建使用的环境 windows10vs2019py2.7cmake3 从GitHub上clone源码https://github.com/cocos2d/cocos2d-x coco2d-x默认带了submodule&#xff0c;有协同子模块&#xff0c;最好是一起下载&#xff0c;搞个…

国内知名插画培训机构有哪些

国内知名插画培训机构有哪些&#xff1f;给大家梳理了国内5家专业的插画师培训班&#xff0c;最新无大插画班排行榜&#xff0c;各有优势和特色&#xff01; 一&#xff1a;国内知名插画培训机构排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画、古…

MYSQL 配置优化

max_connections 允许客户端并发连接的最大数量&#xff0c;默认值是151。 show status like %connections%; 设置参数值应大于Max_used_connections。如果使用连接池&#xff0c;可参考连接池的最大连接数和每个连接池的数量作为参考设置 innodb_buffe_pool_instances Inno…

【华为云-开发者专属集市】DevCloud+ECS、MySQL搭建WordPress

文章目录AppBazaar官网选择与购买项目项目概况操作过程购买DevCloud服务创建项目添加制品库应用部署购买ECS添加部署模板并执行任务故障排除安装及访问WordPress登录网站管理后台访问网站完善部署模板资源释放使用总结AppBazaar官网 首先&#xff0c;我们来到AppBazaar的官网&…

【Kubernetes】【十五】Service详解 Service介绍 类型 使用

第七章 Service详解 本章节主要介绍kubernetes的流量负载组件&#xff1a;Service和Ingress。 Service介绍 ​ 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着…

数据库必知必会:TiDB(11)TiDB集群安装

数据库必知必会&#xff1a;TiDB&#xff08;11&#xff09;TiDB集群安装TiDB集群安装单机环境上安装集群下载并安装TiUP工具安装TiUP cluster组件创建拓扑文件配置SSH免密登录检查安装要求创建安装目录部署集群启动集群验证集群启动使用命令验证通过Dashboard查看通过Grafana查…

2023年1月冰箱品牌销量排行:销量环比增长26%,销售额36亿+

鲸参谋电商大数据2023年1月京东平台“冰箱”销售数据出炉&#xff01; 根据鲸参谋平台电商数据显示&#xff0c;2023年1月份&#xff0c;在京东平台上&#xff0c;冰箱的销量将近130万件&#xff0c;环比增长26%&#xff0c;同比下滑8%&#xff1b;销售额达36亿&#xff0c;环比…

嵌入式开发:C++在深度嵌入式系统中的应用

深度嵌入式系统通常在C语言中实现。为什么会这样?这样的系统是否也能从C中获益?嵌入式开发人员在将广泛、高效的深度嵌入式代码库从C转换为C方面的实践经验的贡献。嵌入式和深度嵌入式系统通常用C而不是C实现。软件开发人员必须放弃C作为强类型系统、模板元编程(TMP)和面向对…

dubbo整合nacos进行远程调用

doubbo是什么&#xff1f; Apache Dubbo 最初在 2008 年由 Alibaba 捐献开源&#xff0c;很快成为了国内开源服务框架选型的事实标准框架 &#xff0c;得到了各行各业的广泛应用。在 2017 年&#xff0c;Dubbo 正式捐献到 Apache 软件基金会并成为 Apache 顶级项目&#xff0c…

DJI 无人机 Onboard SDK ROS 功能包demo运行

DJI 无人机 Onboard SDK ROS 功能包demo运行demo功能准备测试环境运行 dji sdk 节点运行 demo 节点自动飞行任务航点自动飞行兴趣点环绕自动飞行飞行控制本地坐标位置控制搭建好 Onboard SDK ROS 的开发环境后&#xff0c;功能包自身具备一些写好的demo功能案例 dji sdk 的节点…

华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】

使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12201821.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 猴子爬山 | 华为OD机…