package cn.toesbieya.jxc.service.doc;
import cn.toesbieya.jxc.annoation.Lock;
import cn.toesbieya.jxc.annoation.UserAction;
import cn.toesbieya.jxc.enumeration.DocFinishEnum;
import cn.toesbieya.jxc.enumeration.DocHistoryEnum;
import cn.toesbieya.jxc.enumeration.DocStatusEnum;
import cn.toesbieya.jxc.exception.JsonResultException;
import cn.toesbieya.jxc.mapper.*;
import cn.toesbieya.jxc.model.entity.*;
import cn.toesbieya.jxc.model.vo.R;
import cn.toesbieya.jxc.model.vo.SellOutboundVo;
import cn.toesbieya.jxc.model.vo.UserVo;
import cn.toesbieya.jxc.model.vo.export.SellOutboundExport;
import cn.toesbieya.jxc.model.vo.result.PageResult;
import cn.toesbieya.jxc.model.vo.search.SellOutboundSearch;
import cn.toesbieya.jxc.model.vo.update.DocStatusUpdate;
import cn.toesbieya.jxc.service.BizStockService;
import cn.toesbieya.jxc.service.RecService;
import cn.toesbieya.jxc.util.DocUtil;
import cn.toesbieya.jxc.util.ExcelUtil;
import cn.toesbieya.jxc.util.Util;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@Slf4j
public class BizSellOutboundService {
@Resource
private BizSellOutboundMapper mainMapper;
@Resource
private BizSellOutboundSubMapper subMapper;
@Resource
private BizSellOrderMapper orderMapper;
@Resource
private BizSellOrderSubMapper orderSubMapper;
@Resource
private BizDocHistoryMapper historyMapper;
@Resource
private BizStockMapper stockMapper;
@Resource
private RecService recService;
@Resource
private BizStockService stockService;
//组装子表、附件列表的数据
public SellOutboundVo getById(String id) {
BizSellOutbound main = mainMapper.selectById(id);
if (main == null) return null;
SellOutboundVo vo = new SellOutboundVo(main);
vo.setData(getSubById(id));
vo.setImageList(recService.getAttachmentByPid(id));
return vo;
}
//根据主表ID获取子表
public List<BizSellOutboundSub> getSubById(String id) {
return subMapper.selectList(
Wrappers.lambdaQuery(BizSellOutboundSub.class)
.eq(BizSellOutboundSub::getPid, id)
);
}
public PageResult<BizSellOutbound> search(SellOutboundSearch vo) {
PageHelper.startPage(vo.getPage(), vo.getPageSize());
return new PageResult<>(mainMapper.selectList(getSearchCondition(vo)));
}
public void export(SellOutboundSearch vo, HttpServletResponse response) throws Exception {
List<SellOutboundExport> list = mainMapper.export(getSearchCondition(vo));
ExcelUtil.exportSimply(list, response, "销售出库单导出");
}
@UserAction("'添加销售出库单'")
@Transactional(rollbackFor = Exception.class)
public R add(SellOutboundVo doc) {
return addMain(doc);
}
@UserAction("'修改销售出库单'+#doc.id")
@Lock("#doc.id")
@Transactional(rollbackFor = Exception.class)
public R update(SellOutboundVo doc) {
return updateMain(doc);
}
@UserAction("'提交销售出库单'+#doc.id")
@Lock("#doc.id")
@Transactional(rollbackFor = Exception.class)
public R commit(SellOutboundVo doc) {
boolean isFirstCreate = StringUtils.isEmpty(doc.getId());
R result = isFirstCreate ? addMain(doc) : updateMain(doc);
if (result.isSuccess()) {
historyMapper.insert(
BizDocHistory.builder()
.pid(doc.getId())
.type(DocHistoryEnum.COMMIT.getCode())
.uid(doc.getCid())
.uname(doc.getCname())
.statusBefore(DocStatusEnum.DRAFT.getCode())
.statusAfter(DocStatusEnum.WAIT_VERIFY.getCode())
.time(System.currentTimeMillis())
.build()
);
result.setMsg("提交成功");
}
else result.setMsg("提交失败," + result.getMsg());
return result;
}
@UserAction("'撤回销售出库单'+#vo.id")
@Lock("#vo.id")
@Transactional(rollbackFor = Exception.class)
public R withdraw(DocStatusUpdate vo, UserVo user) {
String id = vo.getId();
String info = vo.getInfo();
if (rejectById(id) < 1) {
return R.fail("撤回失败,请刷新重试");
}
historyMapper.insert(
BizDocHistory.builder()
.pid(id)
.type(DocHistoryEnum.WITHDRAW.getCode())
.uid(user.getId())
.uname(user.getNickName())
.statusBefore(DocStatusEnum.WAIT_VERIFY.getCode())
.statusAfter(DocStatusEnum.DRAFT.getCode())
.time(System.currentTimeMillis())
.info(info)
.build()
);
return R.success("撤回成功");
}
@UserAction("'通过销售出库单'+#vo.id")
@Lock({"#vo.pid", "#vo.id"})
@Transactional(rollbackFor = Exception.class)
public R pass(DocStatusUpdate vo, UserVo user) {
String id = vo.getId();
String info = vo.getInfo();
String pid = vo.getPid();
long now = System.currentTimeMillis();
List<BizSellOutboundSub> subList = getSubById(vo.getId());
String err = check(vo.getPid(), subList);
if (err != null) return R.fail("通过失败," + err);
if (1 > mainMapper.update(
null,
Wrappers.lambdaUpdate(BizSellOutbound.class)
.set(BizSellOutbound::getStatus, DocStatusEnum.VERIFIED.getCode())
.set(BizSellOutbound::getVid, user.getId())
.set(BizSellOutbound::getVname, user.getNickName())
.set(BizSellOutbound::getVtime, now)
.eq(BizSellOutbound::getId, id)
.eq(BizSellOutbound::getStatus, DocStatusEnum.WAIT_VERIFY.getCode())
)) {
return R.fail("通过失败,请刷新重试");
}
//按分类分组统计出库数量,并出库
Map<Integer, BigDecimal> outboundCount = new HashMap<>();
for (BizSellOutboundSub outboundSub : subList) {
int rows = stockMapper.outbound(outboundSub.getSid(), outboundSub.getNum());
if (rows == 0) {
throw new JsonResultException(String.format("通过失败,商品%s库存不足", outboundSub.getCname()));
}
Integer cid = outboundSub.getCid();
BigDecimal num = outboundCount.getOrDefault(cid, BigDecimal.ZERO);
outboundCount.put(cid, num.add(outboundSub.getNum()));
}
//更新销售订单子表的剩余未出库数量,记录销售订单的完成情况
DocFinishEnum finish = DocFinishEnum.FINISHED;
List<BizSellOrderSub> orderSubList = getOrderSubListByPid(pid);
for (BizSellOrderSub orderSub : orderSubList) {
if (orderSub.getRemainNum().equals(BigDecimal.ZERO)) {
continue;
}
BigDecimal outboundNum = outboundCount.get(orderSub.getCid());
if (outboundNum == null) continue;
BigDecimal gap = orderSub.getRemainNum().subtract(outboundNum);
//如果有任意一个�
没有合适的资源?快使用搜索试试~ 我知道了~
进销存_SpringBoot_vue-element-adm_1742206235.zip

共1007个文件
java:398个
js:206个
vue:155个

需积分: 5 0 下载量 175 浏览量
2025-03-19
02:06:46
上传
评论
收藏 2.71MB ZIP 举报
温馨提示
前后端分离开发
资源推荐
资源详情
资源评论

























收起资源包目录





































































































共 1007 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11
资源评论

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

三年呀
- 粉丝: 503
- 资源: 2819
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- COMSOL中基于SAW行波驻波传感器在铌酸锂128度Y切X传播的三维模型及其瞬态仿真分析.pdf
- COMSOL中基于弹性波的孔洞无损检测模型介绍.pdf
- COMSOL中基于浆液黏度时空变化的水平裂隙岩体注浆扩散数值模拟.pdf
- COMSOL中基于动水条件下裂隙注浆扩散的数值模拟研究——针对两种速凝浆液(水泥–水玻璃浆液与高聚物改性水泥浆液)的扩散规律与影响因素分析.pdf
- COMSOL中基于相场方法(水平集方法)的多孔介质两相驱替模拟的算例与拓展研究.pdf
- COMSOL中基于相场方法模拟裂缝多孔介质渗吸算例及其与守恒_非守恒条件下计算结果的比较:水平集方法与相场方法的对比.pdf
- COMSOL中基于相场和水平集的相对渗透率计算方法及质量守恒保障措施.pdf
- Comsol中空气N2沿面闪络等离子体模型的针板电极仿真及电子密度变化云图等分析.pdf
- COMSOL中煤层注气热力流THM耦合下增强甲烷开采的实现.pdf
- COMSOL中偶极子天线的散射体与远场图及二维方向图分析.pdf
- Comsol中双BIC复现电磁感应透明的实践.pdf
- COMSOL中三次谐波的反射谱与变功率、变强度设置.pdf
- COMSOL中手性介质特殊本构关系修改及与空气界面处表面态的说明案例.pdf
- COMSOL中水平集法与蠕动流模块模拟裂隙注浆过程:浆液-岩体耦合作用的模拟研究.pdf
- COMSOL中双温方程的系数形式偏微分方程模型及其在温度变化曲线与云图上的应用与拓展.pdf
- Comsol中双层结构曲界面声场仿真的分析与探索.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
