当前位置: 首页 > news >正文

springboot vue 开源 会员收银系统 (7) 收银台的完善 新增开卡 结算

前言

完整版演示
开发版演示

在前面的开发中,我们成功完成了商品分类和商品信息的搭建,开发了收银台基础。现在,我们将进一步完善收银台的功能,添加开卡和结算功能,并在后台实现会员卡的创建和订单保存。同时,我们还将保存页面vue data数据用于修改订单

1.收银台添加开卡功能 后期不仅限开发 还有续卡 套餐…开卡
结算
2.结算后需要生成订单在此注意几个订单的问题

  • 需要有主订单表 一个订单有多个商品需要创建一个订单详情表与之关联
  • 还需要创建一个支付方式表 一个订单有多种支付方式
  • 订单表需要关联会员id便于筛查和查询消费记录
  • 添加状态字段用于消单、改单 (并创建一个表保存当前vue实例的data用于修改订单)

以下为相关表格

CREATE TABLE `business_sell` (`SELL_ID` varchar(32) NOT NULL COMMENT '订单id',`SELL_NO` varchar(255) DEFAULT NULL COMMENT '订单号',`SERIAL_NO` varchar(32) DEFAULT NULL COMMENT '流水号',`MEMBER_ID` varchar(32) DEFAULT NULL COMMENT '会员ID',`MEMBER_NAME` varchar(255) DEFAULT NULL COMMENT '会员名称',`MEMBER_CARD_ID` varchar(32) DEFAULT NULL COMMENT '会员卡id',`SELL_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '消费金额',`REAL_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '实际入账',`SELL_TYPE` tinyint(2) DEFAULT NULL COMMENT '1开卡 2续卡 3项目/卖品',`SELL_STATUS` tinyint(2) DEFAULT '0' COMMENT '0正常 1取消',`DELETED` tinyint(2) DEFAULT '0' COMMENT '0正常 1删除',`VERSION` bigint(10) DEFAULT '0' COMMENT '乐观锁字段',`SHOP_ID` varchar(32) DEFAULT NULL COMMENT '门店id',`SHOP_NAME` varchar(255) DEFAULT NULL COMMENT '门店名',`CREATE_NAME` varchar(255) DEFAULT NULL COMMENT '创建人',`CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',`CREATE_ID` varchar(32) DEFAULT NULL COMMENT '创建人id',`UPDATE_TIME` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',`UPDATE_NAME` varchar(255) DEFAULT NULL COMMENT '修改人',`UPDATE_ID` varchar(32) DEFAULT NULL COMMENT '修改人id',`MEMBER_CARD_AFTER_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '消费后金额',`MEMBER_CARD_BEFORE_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '消费前赠送金额',`MEMBER_CARD_BEFORE_GIVE_AMOUNT` decimal(10,2) DEFAULT NULL,`MEMBER_CARD_AFTER_GIVE_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '消费后赠送金额',PRIMARY KEY (`SELL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单';
CREATE TABLE `business_sell_detail` (`SELL_DETAIL_ID` varchar(32) NOT NULL COMMENT '销售细单id',`MEMBER_ID` varchar(32) DEFAULT NULL COMMENT '会员id',`SELL_ID` varchar(32) DEFAULT NULL COMMENT '订单id',`SELL_TYPE` tinyint(2) DEFAULT NULL COMMENT '1开卡 2续卡 3项目 4卖品',`MEMBER_CARD_ID` varchar(32) DEFAULT NULL COMMENT '会员卡id',`PRODUCT_ID` varchar(32) DEFAULT NULL COMMENT '商品ID',`PRODUCT_NAME` varchar(255) DEFAULT NULL COMMENT '商品名',`COUNT` int(10) DEFAULT '1' COMMENT '商品数量',`DISCOUNT` decimal(10,2) DEFAULT NULL COMMENT '折扣',`AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '金额',`REAL_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '实际金额',`CARD_ID` varchar(32) DEFAULT NULL COMMENT '卡项ID',`CARD_NAME` varchar(255) DEFAULT NULL COMMENT '卡名',`GIVE_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '赠送金额',`SHOP_ID` varchar(32) DEFAULT NULL COMMENT '门店id',`SHOP_NAME` varchar(255) DEFAULT NULL COMMENT '门店名',`CREATE_NAME` varchar(255) DEFAULT NULL COMMENT '创建人',`CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',`CREATE_ID` varchar(32) DEFAULT NULL COMMENT '创建人id',`UPDATE_TIME` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',`UPDATE_NAME` varchar(255) DEFAULT NULL COMMENT '修改人',`UPDATE_ID` varchar(32) DEFAULT NULL COMMENT '修改人id',`SELL_STATUS` tinyint(2) DEFAULT '0' COMMENT '0正常 1取消',PRIMARY KEY (`SELL_DETAIL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单详情';
CREATE TABLE `business_sellpay` (`SELL_PAY_ID` varchar(32) NOT NULL COMMENT '支付id',`SELL_ID` varchar(32) DEFAULT NULL COMMENT '销售单id',`PAY_NAME` varchar(255) DEFAULT NULL COMMENT '支付方式名称',`PAY_TYPE` tinyint(2) DEFAULT NULL COMMENT '1.卡金 2.扫码 3.现金  888.优惠 ',`AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '金额',PRIMARY KEY (`SELL_PAY_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单支付';
CREATE TABLE `business_selljson` (`JSON_ID` varchar(32) NOT NULL,`SELL_ID` varchar(32) DEFAULT NULL COMMENT '订单id',`SELL_JSON` json DEFAULT NULL COMMENT '获得下订单时的JSON',PRIMARY KEY (`JSON_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单json';

3.订单创建完毕后还需要创建会员卡
这样后续就可以选择会员卡卡金支付了

CREATE TABLE `business_member_card` (`MEMBER_CARD_ID` varchar(32) NOT NULL COMMENT '会员卡id',`MEMBER_ID` varchar(32) DEFAULT NULL COMMENT '会员id',`CARD_ID` varchar(32) DEFAULT NULL COMMENT '卡项ID',`CARD_NO` varchar(255) DEFAULT NULL COMMENT '卡号',`CARD_NAME` varchar(255) DEFAULT NULL COMMENT '卡名称',`AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '余额',`GIVE_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '赠送金额',`DISCOUNT` decimal(10,2) DEFAULT NULL COMMENT '商品折扣',`BUILD_CARD_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '开卡金额',`PUSH_MONEY` decimal(10,2) DEFAULT NULL COMMENT '提成比例',`CARD_STATUS` tinyint(2) DEFAULT '0' COMMENT '0正常 1取消',`DELETED` tinyint(2) DEFAULT '0' COMMENT '0正常 1删除',`VERSION` bigint(10) DEFAULT '0' COMMENT '乐观锁字段',`SHOP_ID` varchar(32) DEFAULT NULL COMMENT '门店id',`SHOP_NAME` varchar(255) DEFAULT NULL COMMENT '门店名',`CREATE_NAME` varchar(255) DEFAULT NULL COMMENT '创建人',`CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',`CREATE_ID` varchar(32) DEFAULT NULL COMMENT '创建人id',`UPDATE_TIME` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',`UPDATE_NAME` varchar(255) DEFAULT NULL COMMENT '修改人',`UPDATE_ID` varchar(32) DEFAULT NULL COMMENT '修改人id',PRIMARY KEY (`MEMBER_CARD_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员卡';
package com.dd.admin.business.pay.service.impl;import com.dd.admin.business.card.entity.Card;
import com.dd.admin.business.card.service.CardService;
import com.dd.admin.business.memberCard.domain.MemberCardVo;
import com.dd.admin.business.memberCard.entity.MemberCard;
import com.dd.admin.business.memberCard.service.MemberCardService;
import com.dd.admin.business.pay.domain.BaseSell;
import com.dd.admin.business.pay.domain.BuildCardForm;
import com.dd.admin.business.pay.domain.BuildCardSell;
import com.dd.admin.business.pay.service.AddSellDetailService;
import com.dd.admin.business.sell.entity.Sell;
import com.dd.admin.business.sell.service.SellService;
import com.dd.admin.business.sellDetail.entity.SellDetail;
import com.dd.admin.business.sellDetail.service.SellDetailService;
import com.dd.admin.business.sellPay.entity.Sellpay;
import com.dd.admin.business.sellPay.service.SellpayService;
import com.dd.admin.common.exception.ApiException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.math.BigDecimal;import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.CARDNO_ALREADY_EXIST;@Service
public class SellDetailBuildCard implements AddSellDetailService {@Autowiredprivate CardService cardService;@Autowiredprivate MemberCardService memberCardService;@Autowiredprivate SellDetailService sellDetailService;@Autowiredprivate SellpayService sellpayService;@Autowiredprivate SellService sellService;@Overridepublic void addSellDetail(Sell sell, BaseSell sellDto) {//转换数据BuildCardSell buildCardSell = (BuildCardSell) sellDto;// 1 获取开卡金额 等信息 先开卡String cardId = buildCardSell.getBuildCardForm().getCardId();//获取需要的开卡信息Card card = cardService.getById(cardId);//开卡MemberCard memberCard = buildMemberCard(sell, buildCardSell.getBuildCardForm(), card);//2生成销售细单SellDetail sellDetail = addSellDetail(sell,buildCardSell,memberCard);//添加支付方式sellpayService.addSellPayList(buildCardSell.getSellPayList(),sell.getSellId());//4因为是开卡还要设置额外信息Sell extraSellInfo = new Sell();extraSellInfo.setSellId(sell.getSellId());//设置会员信息extraSellInfo.setMemberId(buildCardSell.getMemberId());extraSellInfo.setMemberName(buildCardSell.getMemberName());//设置订单的卡信息extraSellInfo.setMemberCardId(memberCard.getMemberCardId());//设置订单的卡余额extraSellInfo.setMemberCardBeforeAmount(BigDecimal.ZERO);extraSellInfo.setMemberCardBeforeGiveAmount(BigDecimal.ZERO);extraSellInfo.setMemberCardAfterAmount(memberCard.getAmount());extraSellInfo.setMemberCardAfterGiveAmount(memberCard.getGiveAmount());sellService.updateById(extraSellInfo);}MemberCard buildMemberCard(Sell sell, BuildCardForm buildCardForm, Card card){//设置卡的基本和余额信息MemberCard memberCard = new MemberCard();memberCard.setMemberId(sell.getMemberId());memberCard.setCardId(card.getCardId());memberCard.setCardName(card.getCardName());String cardNo = buildCardForm.getCardNo();MemberCardVo membercardVo =  memberCardService.selectOneByCardNo(cardNo);if(membercardVo!=null){throw new ApiException(CARDNO_ALREADY_EXIST);}memberCard.setCardNo(buildCardForm.getCardNo());memberCard.setAmount(buildCardForm.getCardAmount());memberCard.setBuildCardAmount(buildCardForm.getCardAmount());memberCard.setGiveAmount(buildCardForm.getGiveAmount());//获取订单的卡折扣信息 设置进会员卡中memberCard.setDiscount(card.getCardDiscount());//设置该卡的提成金额memberCard.setPushMoney(card.getCardPushPercent());memberCardService.save(memberCard);return memberCard;}SellDetail addSellDetail(Sell sell,BuildCardSell buildCardSell,MemberCard membercard){BuildCardForm buildCardForm = buildCardSell.getBuildCardForm();SellDetail sellDetail = new SellDetail();//3设置订单id 订单类型 订单状态sellDetail.setSellId(sell.getSellId());sellDetail.setSellType(sell.getSellType());sellDetail.setMemberId(sell.getMemberId());//设置商品信息sellDetail.setCardId(buildCardForm.getCardId());sellDetail.setCardName(buildCardForm.getCardName());sellDetail.setAmount(buildCardForm.getCardAmount());sellDetail.setGiveAmount(buildCardForm.getGiveAmount());sellDetail.setRealAmount(sell.getRealAmount());//设置会员信息sellDetail.setMemberCardId(membercard.getMemberCardId());//开卡后卡金和赠送金sellDetail.setAmount(membercard.getAmount());sellDetail.setGiveAmount(membercard.getGiveAmount());//保存销售细单sellDetailService.save(sellDetail);return sellDetail;}}

后续我们需要完成收银台的选择会员卡支付
订单管理功能

代码地址
https://gitee.com/ddeatrr/memberShop

相关文章:

springboot vue 开源 会员收银系统 (7) 收银台的完善 新增开卡 结算

前言 完整版演示 开发版演示 在前面的开发中,我们成功完成了商品分类和商品信息的搭建,开发了收银台基础。现在,我们将进一步完善收银台的功能,添加开卡和结算功能,并在后台实现会员卡的创建和订单保存。同时&#xff…...

虚拟现实环境下的远程教育和智能评估系统(十三)

管理/教师端前端工作汇总education-admin: 首先是登录注册页面的展示 管理员 首页 管理员登录后的首页如下图所示 管理员拥有所有的权限 课程管理 1、可以查看、修改、增添、删除课程列表内容 2、可以对课程资源进行操作 3、可以对课程的类别信息进行管理&…...

深入了解软件设计模式:创新应用与优化代码结构

前言 在软件开发中,设计模式被广泛应用,通常分为三大类:创建型、结构型和行为型。这些模式经过时间验证,在解决特定问题和优化代码结构方面发挥了重要作用。本文将详细介绍每一类设计模式,并通过具体实例展示它们的应…...

android studio 模拟器文件查找

android studio 模拟器文件查找 使用安卓模拟器下载文件后通常无法在系统硬盘上找到下载的文件,安卓 studio studio 其实提供了文件浏览工具,找到后可以直接使用 Android studio 打开 打开 Android studioview 菜单view > Tool Windows > Device…...

【科普】半导体制造过程的步骤、技术、流程

在这篇文章中,我们将学习基本的半导体制造过程。为了将晶圆转化为半导体芯片,它需要经历一系列复杂的制造过程,包括氧化、光刻、刻蚀、沉积、离子注入、金属布线、电气检测和封装等。 基本的半导体制造过程 1.晶圆(Wafer&#xf…...

c89、c99、c11

C99 标准开始引入了 // 单行注释。在此之前,C语言只支持 /* ... */ 多行注释。 具体说明: // 单行注释:在C99标准(ISO/IEC 9899:1999)引入之前,C语言中没有单行注释。C99标准借鉴了C的注释风格&#xff0…...

【网络安全的神秘世界】已解决burpsuite报错Failed to start proxy service on 127.0.0.1:8080

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 解决burpsuite无法在 127.0.0.1:8080 上启动代理服务端口被占用以及抓不到本地包的问题 Burpsuite无法启动proxy…...

【C#】使用数字和时间方法ToString()格式化输出字符串显示

在C#编程项目开发中,几乎所有对象都有格式化字符串方法,其中常见的是数字和时间的格式化输出多少不一样,按实际需要而定吧,现记录如下,以后会用得上。 文章目录 数字格式化时间格式化 数字格式化 例如,保留…...

Mac系统主机名变为bogon的解决方案

如题 在使用Mac操作系统时,您可能会遇到一个有趣且略显困扰的问题:终端中显示的主机名突然变成了“bogon”。这不仅让人困惑,还可能给日常操作带来不便。本文旨在提供一种简便的解决方法,帮助您将主机名恢复为正常状态。 什么是…...

行列式和矩阵的区别

目录 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 同济大学数学系. 工程数学…...

MATLAB复习

MATLAB常用的标点符号 空格 变量分隔符 矩阵一行中各元素间的分隔符 程序语句关键词分隔符 逗号,分隔显示计算结果的各语句 变量分隔符 矩阵中一行各元素的分隔符点号.数值中的小数点 结构数组的域访问符分号;分隔不想显示计算结果的各语句 矩阵行与行的…...

Android11 动态权限申请

1、单个权限检查及申请 private void checkSinglePermission(){// 在需要的地方,如Activity中if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)! PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,…...

线性卷积(相关)和圆周卷积(相关)以及FFT之间的关系(AEC举例)

时域自适应滤波算法中的线性卷积和线性相关运算量较大,导致计算复杂度升高,我们更愿意把这两个信号变换到频域,通过频域相乘的方式来取代时域复杂度相当高的卷积或相关运算。 预备知识:线性卷积(相关)和圆…...

AMD平台,5600X+6650XT,虚拟机安装macOS 14(2024年6月)

AMD平台安装macOS 14的麻烦,要比Intel平台多的多,由于macOS从13开始,对CPU寄存器的读取进行了改变,导致AMD平台只要安装完macOS 13及以后版本,开机后就报五国语言错误,不断重启。改vmx文件,被证…...

Spring源码之手写DI

Spring源码之手写DI 我们来回顾一下前面手写IOC的内容。 一、DI介绍 DI(Dependency injection)依赖注入。对象之间的依赖由容器在运行期决定,即容器动态的将某个依赖注入到对象之中。说直白点就是给Bean对象的成员变量赋值。 在这里我们就需要明白几个问题。 1.…...

从零入手人工智能(5)—— 决策树

1.前言 在上一篇文章《从零入手人工智能(4)—— 逻辑回归》中讲述了逻辑回归这个分类算法,今天我们的主角是决策树。决策树和逻辑回归这两种算法都属于分类算法,以下是决策树和逻辑回归的相同点: 分类任务&#xff1…...

go语言:两协程并发交替打印数字和字母(代码逐行注释)

要求: 并发两协程交替打印数字和字母。一个协程打印数字,一个协程打印字母。 输出: 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 思路: 两个 channel 控制两个协程进行交替打印。sync.WaitG…...

TWM论文阅读笔记

这是ICLR2023的一篇world model论文,用transformer来做世界模型的sequence prediction。文章贡献是transformer-based world model(不同于以往的如transdreamer的world model,本文的transformer-based world model在inference 的时候可以丢掉…...

探索ChatTTS项目:高效的文字转语音解决方案

文章目录 📖 介绍 📖📒 ChatTTS 📒📝 项目介绍📝 项目亮点📝 UI 🎈 项目地址 🎈 📖 介绍 📖 在AI技术迅速发展的今天,文本到语音&…...

[Django学习]Q对象实现多字段模糊搜索

一、应用场景 假设我们现在有一个客房系统,前端界面上展示出来了所有客房的所有信息。用户通过客房的价格、面积、人数等对客房进行模糊搜索,如检索出价格在50到100元之间的客房,同时检索面积在20平方米到30平方米之间的客房,此时后端可以借助…...

开源监控面板OpenClaw:从架构设计到生产部署实战指南

1. 项目概述:一个开源监控面板的诞生 在运维和开发的世界里,监控面板就像是驾驶舱里的仪表盘。没有它,你就是在盲飞。今天要聊的这个项目 xingrz/openclaw-dashboard ,就是一个由社区驱动的开源监控面板解决方案。它的名字很有意…...

我的Claude Code不再被封号,Taotoken提供了稳定可靠的替代方案

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 我的Claude Code不再被封号,Taotoken提供了稳定可靠的替代方案 作为一名频繁使用Claude Code进行代码生成和审查的个人…...

从SD卡初始化到读写文件:一个完整嵌入式项目中的SDIO驱动避坑实践

从SD卡初始化到读写文件:嵌入式SDIO驱动实战全解析 在嵌入式系统开发中,SD卡因其高容量、低成本和便携性成为数据存储的首选方案。然而,看似简单的SD卡接口背后隐藏着复杂的初始化协议和时序要求。许多工程师在项目初期都会遇到SD卡无法识别、…...

【HarmonyOS 6.1 全场景实战】《灵犀厨房》之【营养分析引擎】计算个性化卡路里建议:给《灵犀厨房》装上“营养大脑”

【营养分析引擎】计算个性化卡路里建议:给《灵犀厨房》装上“营养大脑” 摘要:从“爱吃什么”到“该吃什么”,是《灵犀厨房》进化的关键一步。上一篇我们刚打通了 Health Kit 数据,今天,我们就要基于 Mifflin-St Jeor …...

ncmdumpGUI:3分钟解锁网易云音乐ncm格式,让你的音乐无处不在

ncmdumpGUI:3分钟解锁网易云音乐ncm格式,让你的音乐无处不在 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐下载的nc…...

终极Python通达信数据解析方案:mootdx完整使用指南与金融量化实践

终极Python通达信数据解析方案:mootdx完整使用指南与金融量化实践 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融数据分析和量化交易领域,通达信作为国内主流的证券…...

Blitz.js全栈开发框架:零API理念与Next.js深度集成实战

1. 项目概述:一个颠覆性的全栈开发框架如果你和我一样,在过去的几年里,一直在React生态圈里打转,从Create React App到Next.js,再到尝试自己搭建一套包含身份验证、数据层、API路由的完整应用,那你一定对那…...

基于LLM的游戏AI智能体:从感知到决策的框架构建与实践

1. 项目概述:一个能“玩”游戏的AI智能体最近在GitHub上看到一个挺有意思的项目,叫ChattyPlay-Agent。光看名字,你可能会觉得这又是一个基于大语言模型的聊天机器人。但点进去仔细研究后,我发现它的定位非常独特:这是一…...

基于Vanilla JS与IndexedDB构建本地化Markdown笔记工具

1. 项目概述:从零开始构建一个轻量级笔记工具最近在整理个人知识库时,发现市面上的笔记软件要么功能过于臃肿,要么云端同步存在隐私顾虑,要么就是定制化程度不够。作为一个有十多年开发经验的从业者,我决定自己动手&am…...

机械臂时间冲击最优轨迹规划【附代码】

✨ 长期致力于串联机械臂、时间-冲击最优、轨迹规划、多目标粒子群算法、非支配排序遗传算法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)构建基于…...