|
@@ -0,0 +1,238 @@
|
|
|
+package com.fjhx.stock.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.fjhx.base.BasicEntity;
|
|
|
+import com.fjhx.constants.StatusConstant;
|
|
|
+import com.fjhx.entity.material.Material;
|
|
|
+import com.fjhx.entity.stock.StockBack;
|
|
|
+import com.fjhx.entity.stock.StockBackDetails;
|
|
|
+import com.fjhx.material.service.MaterialService;
|
|
|
+import com.fjhx.params.stock.*;
|
|
|
+import com.fjhx.stock.mapper.StockBackMapper;
|
|
|
+import com.fjhx.stock.service.StockBackDetailsService;
|
|
|
+import com.fjhx.stock.service.StockBackService;
|
|
|
+import com.fjhx.utils.Assert;
|
|
|
+import com.fjhx.utils.WrapperUtil;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 退仓面料 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author ${author}
|
|
|
+ * @since 2022-08-31
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class StockBackServiceImpl extends ServiceImpl<StockBackMapper, StockBack> implements StockBackService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private StockBackDetailsService stockBackDetailsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MaterialService materialService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<StockBack> getPage(Map<String, String> condition) {
|
|
|
+
|
|
|
+ QueryWrapper<StockBack> wrapper = Wrappers.query();
|
|
|
+
|
|
|
+ WrapperUtil.init(condition, wrapper)
|
|
|
+ .createTimeDesc();
|
|
|
+
|
|
|
+ Page<StockBack> page = page(condition, wrapper);
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void add(StockBackVo stockBackVo) {
|
|
|
+ save(stockBackVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void edit(StockBackVo stockBackVo) {
|
|
|
+ updateById(stockBackVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void delete(StockBackVo stockBackVo) {
|
|
|
+ removeById(stockBackVo.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map<String, Object>> getPickingToday(Map<String, String> condition) {
|
|
|
+ String userId = condition.get("userId");
|
|
|
+ Assert.notEmpty(userId, "用户id不能为空");
|
|
|
+
|
|
|
+ Date date = new Date();
|
|
|
+
|
|
|
+ QueryWrapper<Object> wrapper = Wrappers.query()
|
|
|
+ .eq("swd.OperUserId", userId)
|
|
|
+ .in("swd.StockChangeType", 20, 23)
|
|
|
+ .between("swd.CreatedTime", DateUtil.beginOfDay(date), DateUtil.endOfDay(date))
|
|
|
+ .groupBy("m.id");
|
|
|
+
|
|
|
+ return baseMapper.getPickingToday(wrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public void submitBack(SubmitBackVo submitBackVo) {
|
|
|
+
|
|
|
+ List<BackDetail> backDetailList = submitBackVo.getBackDetailList();
|
|
|
+ String operatorId = submitBackVo.getOperatorId();
|
|
|
+ Date date = new Date();
|
|
|
+
|
|
|
+ List<StockBackDetails> stockBackDetailsList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (BackDetail backDetail : backDetailList) {
|
|
|
+ List<BigDecimal> materialMetersList = backDetail.getMaterialMetersList();
|
|
|
+ String materialId = backDetail.getMaterialId();
|
|
|
+
|
|
|
+ // 面料退仓
|
|
|
+ StockBack stockBack = new StockBack();
|
|
|
+ stockBack.setOperatorId(operatorId);
|
|
|
+ stockBack.setCheckerTime(date);
|
|
|
+ stockBack.setOperationNum(materialMetersList.size());
|
|
|
+ stockBack.setOperationMeters(materialMetersList.stream().reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ stockBack.setStatus(StatusConstant.No);
|
|
|
+ save(stockBack);
|
|
|
+
|
|
|
+ // 退仓详情
|
|
|
+ for (BigDecimal materialMeters : materialMetersList) {
|
|
|
+ StockBackDetails stockBackDetails = new StockBackDetails();
|
|
|
+ stockBackDetails.setStockBackId(stockBack.getId());
|
|
|
+ stockBackDetails.setMaterialId(materialId);
|
|
|
+ stockBackDetails.setMaterialMeters(materialMeters);
|
|
|
+ stockBackDetails.setOldMaterialMeters(materialMeters);
|
|
|
+ stockBackDetailsList.add(stockBackDetails);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ stockBackDetailsService.saveBatch(stockBackDetailsList);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map<String, Object>> checkList() {
|
|
|
+ return baseMapper.checkList();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public CheckDetailsVo checkDetails(Long stockBackId) {
|
|
|
+
|
|
|
+ CheckDetailsVo checkDetailsVo = new CheckDetailsVo();
|
|
|
+ checkDetailsVo.setStockBackId(stockBackId);
|
|
|
+
|
|
|
+ List<StockBackDetails> list = stockBackDetailsService.list(StockBackDetails::getStockBackId, stockBackId);
|
|
|
+ Map<String, List<StockBackDetails>> collect = list.stream().collect(Collectors.groupingBy(StockBackDetails::getMaterialId));
|
|
|
+
|
|
|
+ // 通过物料id货物物料名称
|
|
|
+ Map<String, String> materialMap = materialService.listByIds(collect.keySet())
|
|
|
+ .stream().collect(Collectors.toMap(BasicEntity::getId, Material::getName));
|
|
|
+
|
|
|
+ // 退仓面料信息
|
|
|
+ List<CheckDetailsInfo> checkDetailsInfoList = new ArrayList<>();
|
|
|
+
|
|
|
+ collect.forEach((k, v) -> {
|
|
|
+ CheckDetailsInfo checkDetailsInfo = new CheckDetailsInfo();
|
|
|
+ checkDetailsInfo.setMaterialId(k);
|
|
|
+ checkDetailsInfo.setMaterialName(materialMap.get(k));
|
|
|
+ checkDetailsInfo.setStockBackDetailsList(v);
|
|
|
+ checkDetailsInfoList.add(checkDetailsInfo);
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ checkDetailsVo.setCheckDetailsInfoList(checkDetailsInfoList);
|
|
|
+
|
|
|
+ return checkDetailsVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public List<StockBackDetails> submitCheckDetails(CheckDetailsVo checkDetailsVo) {
|
|
|
+
|
|
|
+ Long stockBackId = checkDetailsVo.getStockBackId();
|
|
|
+ String checkerId = checkDetailsVo.getCheckerId();
|
|
|
+
|
|
|
+ List<CheckDetailsInfo> checkDetailsInfoList = checkDetailsVo.getCheckDetailsInfoList();
|
|
|
+
|
|
|
+ List<StockBackDetails> stockBackDetails = new ArrayList<>();
|
|
|
+
|
|
|
+ // 循环退仓面料信息
|
|
|
+ for (CheckDetailsInfo checkDetailsInfo : checkDetailsInfoList) {
|
|
|
+ String materialId = checkDetailsInfo.getMaterialId();
|
|
|
+ List<StockBackDetails> stockBackDetailsList = checkDetailsInfo.getStockBackDetailsList();
|
|
|
+
|
|
|
+ // 循环得到具体某一卷物料
|
|
|
+ for (StockBackDetails backDetails : stockBackDetailsList) {
|
|
|
+ // id为空表示新增,赋值信息
|
|
|
+ if (ObjectUtil.isEmpty(backDetails.getId())) {
|
|
|
+ backDetails.setStockBackId(stockBackId);
|
|
|
+ backDetails.setMaterialId(materialId);
|
|
|
+ backDetails.setOldMaterialMeters(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ stockBackDetails.addAll(stockBackDetailsList);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新增或编辑
|
|
|
+ stockBackDetailsService.saveOrUpdateBatch(stockBackDetails);
|
|
|
+
|
|
|
+ // 后端存在,前端没传入的数据代表已被删除,把米数改为0
|
|
|
+ stockBackDetailsService.update(Wrappers.<StockBackDetails>lambdaUpdate()
|
|
|
+ .eq(StockBackDetails::getStockBackId, stockBackId)
|
|
|
+ .notIn(StockBackDetails::getId, stockBackDetails.stream().map(StockBackDetails::getId).collect(Collectors.toList()))
|
|
|
+ .set(StockBackDetails::getMaterialMeters, BigDecimal.ZERO)
|
|
|
+ );
|
|
|
+
|
|
|
+ // 修改退仓复核信息
|
|
|
+ update(Wrappers.<StockBack>lambdaUpdate()
|
|
|
+ .eq(StockBack::getId, stockBackId)
|
|
|
+ .set(StockBack::getCheckerId, checkerId)
|
|
|
+ .set(StockBack::getCheckerTime, new Date())
|
|
|
+ .set(StockBack::getStatus, StatusConstant.YES)
|
|
|
+ );
|
|
|
+
|
|
|
+ return stockBackDetails;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<Integer, List<Map<String, Object>>> userStatistics(Map<String, String> condition) {
|
|
|
+
|
|
|
+ QueryWrapper<Object> wrapper = createWrapper(condition);
|
|
|
+
|
|
|
+ List<Map<String, Object>> result = baseMapper.userStatistics(wrapper);
|
|
|
+
|
|
|
+ return result.stream().collect(Collectors.groupingBy(item -> (Integer) item.get("technologyType")));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private QueryWrapper<Object> createWrapper(Map<String, String> condition) {
|
|
|
+ String beginTime = condition.get("beginTime");
|
|
|
+ Assert.notEmpty(beginTime, "开始时间不能为空");
|
|
|
+
|
|
|
+ String endTime = condition.get("endTime");
|
|
|
+ Assert.notEmpty(endTime, "结束时间不能为空");
|
|
|
+
|
|
|
+ return Wrappers.query().between("ss.create_time",
|
|
|
+ DateUtil.beginOfDay(DateUtil.parse(beginTime)),
|
|
|
+ DateUtil.endOfDay(DateUtil.parse(endTime)));
|
|
|
+ }
|
|
|
+
|
|
|
+}
|