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);
//如果有任意一个�
没有合适的资源?快使用搜索试试~ 我知道了~
一个前后端分离的简易进销存后台管理系统
共1005个文件
java:398个
js:206个
vue:155个
需积分: 5 0 下载量 48 浏览量
2023-12-28
20:37:31
上传
评论
收藏 2.69MB ZIP 举报
温馨提示
一个前后端分离的简易进销存后台管理系统,基于SpringBoot和vue-element-admin实现,具备常见的后台管理功能,登录态使用session,使用基于资源url的简单权限控制。
资源推荐
资源详情
资源评论
收起资源包目录
一个前后端分离的简易进销存后台管理系统 (1005个子文件)
waifu.css 5KB
.gitignore 225B
.gitignore 220B
.gitignore 220B
.gitignore 65B
.gitignore 39B
index.html 4KB
index.html 3KB
favicon.ico 4KB
favicon.ico 4KB
BizSellOutboundService.java 17KB
SellOutboundService.java 17KB
BizPurchaseInboundService.java 16KB
PurchaseInboundService.java 16KB
BizSellOrderService.java 13KB
SellOrderService.java 13KB
PurchaseOrderService.java 12KB
BizPurchaseOrderService.java 12KB
ExcelUtil.java 8KB
ExcelUtil.java 8KB
AccountService.java 8KB
AccountService.java 8KB
UserService.java 8KB
SysUserService.java 8KB
RecordService.java 6KB
RedisUtil.java 6KB
RedisUtil.java 6KB
ResourceService.java 6KB
CustomerService.java 6KB
SupplierService.java 6KB
SysCustomerService.java 6KB
WebSocketServer.java 6KB
RecService.java 6KB
SysSupplierService.java 6KB
SysResourceService.java 6KB
WebSocketServer.java 6KB
RedisEventListenerConfig.java 5KB
RedisEventListenerConfig.java 5KB
PurchaseOrderController.java 5KB
RouteConfig.java 5KB
PurchaseOrderController.java 5KB
SellOrderController.java 5KB
SellOutboundController.java 5KB
SellOrderController.java 5KB
SellOutboundController.java 5KB
ManageService.java 5KB
MsgService.java 5KB
PurchaseInboundController.java 5KB
PurchaseInboundController.java 5KB
CategoryService.java 5KB
SysCategoryService.java 5KB
DepartmentService.java 4KB
SysDepartmentService.java 4KB
StockService.java 4KB
StatisticTask.java 4KB
IpUtil.java 4KB
StatisticTask.java 4KB
RoleService.java 4KB
IpUtil.java 4KB
SysRoleService.java 4KB
SecurityFilter.java 4KB
StatisticService.java 3KB
AccountController.java 3KB
RestExceptionAspect.java 3KB
StatisticService.java 3KB
RestExceptionAspect.java 3KB
AccountController.java 3KB
SocketConfig.java 3KB
DocUtil.java 3KB
DocTask.java 3KB
DocTask.java 3KB
ManageController.java 3KB
UserController.java 3KB
UserController.java 3KB
SocketConfig.java 3KB
DocUtil.java 3KB
BizStockService.java 3KB
ManageController.java 3KB
LockAspect.java 3KB
ExecutorConfig.java 2KB
LockAspect.java 2KB
SentinelFilter.java 2KB
UserService.java 2KB
CustomerController.java 2KB
SupplierController.java 2KB
CustomerController.java 2KB
SupplierController.java 2KB
Util.java 2KB
UserActionAspect.java 2KB
WebConfig.java 2KB
MsgUserService.java 2KB
CategoryController.java 2KB
Util.java 2KB
SessionTask.java 2KB
WebConfig.java 2KB
UserActionAspect.java 2KB
CategoryController.java 2KB
SessionTask.java 2KB
ResourceConfig.java 2KB
PermissionModule.java 2KB
共 1005 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11
资源评论
Lei宝啊
- 粉丝: 2006
- 资源: 1330
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功