Bladeren bron

采购调整单

FengChaoYu 8 maanden geleden
bovenliggende
commit
f44359c2a0

+ 19 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPurchaseAdjustmentBean.java

@@ -0,0 +1,19 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.plus.entity.WebsitPurchaseAdjustment;
+import com.gree.mall.manager.plus.entity.WebsitPurchaseAdjustmentItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel
+public class WebsitPurchaseAdjustmentBean extends WebsitPurchaseAdjustment {
+
+    @ApiModelProperty(value = "明细")
+    private List<WebsitPurchaseAdjustmentItem> items;
+}

+ 64 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPurchaseAdjustmentVO.java

@@ -0,0 +1,64 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.material.MaterialFlagEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class WebsitPurchaseAdjustmentVO {
+
+    @ApiModelProperty(value = "单号")
+    private String purchaseAdjustmentId;
+
+    @ApiModelProperty(value = "商户名称")
+    private String companyWechatName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "网点编号")
+    private String websitId;
+
+    @ApiModelProperty(value = "网点名称")
+    private String websitName;
+
+    @ApiModelProperty(value = "采购单号")
+    private String ref;
+
+    @ApiModelProperty(value = "仓储名称")
+    private String storageName;
+
+    @ApiModelProperty(value = "单据状态")
+    private MaterialFlagEnum flag;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "提交人")
+    private String submitBy;
+
+    @ApiModelProperty(value = "提交时间")
+    private Date submitTime;
+
+    @ApiModelProperty(value = "审核人")
+    private String confirmBy;
+
+    @ApiModelProperty(value = "审核时间")
+    private Date confirmTime;
+}

+ 3 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/stock/WebsitStockDTO.java

@@ -93,6 +93,9 @@ public class WebsitStockDTO {
     @NotNull(message = "仓位不能空")
     private String storageId;
 
+    @ApiModelProperty("采购订单号")
+    private String purchaseId;
+
     public WebsitStock createPartsStock() {
         WebsitStock websitStock = new WebsitStock();
         BeanUtils.copyProperties(this, websitStock);

+ 8 - 0
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/MaterialMapper.java

@@ -242,4 +242,12 @@ public interface MaterialMapper {
      * @return
      */
     IPage<WebsitPurchaseOrderVO> websitPurchaseOrderPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 采购调整单列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WebsitPurchaseAdjustmentVO> websitPurchaseAdjustmentPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
 }

+ 159 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPurchaseAdjustmentController.java

@@ -0,0 +1,159 @@
+package com.gree.mall.manager.controller.material.manage;
+
+import cn.hutool.core.lang.TypeReference;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.manager.annotation.ZfireList;
+import com.gree.mall.manager.bean.material.manage.WebsitPurchaseAdjustmentBean;
+import com.gree.mall.manager.bean.material.manage.WebsitPurchaseAdjustmentVO;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.material.manage.WebsitPurchaseAdjustmentLogic;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+@Slf4j
+@RestController
+@Api(value = "网点采购调整API", tags ={"网点采购调整API"} )
+@Validated
+@RequestMapping(value = "/websit/purchase/adjustment", produces = "application/json; charset=utf-8")
+public class WebsitPurchaseAdjustmentController {
+
+    @Resource
+    WebsitPurchaseAdjustmentLogic websitPurchaseAdjustmentLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+    @ZfireList
+    @PostMapping("/list")
+    @ApiOperation(value = "网点采购调整-列表")
+    public ResponseHelper<IPage<WebsitPurchaseAdjustmentVO>> page(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<WebsitPurchaseAdjustmentVO> page = websitPurchaseAdjustmentLogic.page(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<WebsitPurchaseAdjustmentVO>() {});
+    }
+
+    @PostMapping("/list/export")
+    @ApiOperation("网点采购调整-导出")
+    public void listExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<WebsitPurchaseAdjustmentVO> baseVOIPage = websitPurchaseAdjustmentLogic.page(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(baseVOIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/detail")
+    @ApiOperation(value = "网点采购调整-详情")
+    public ResponseHelper<WebsitPurchaseAdjustmentBean> detail(
+            @ApiParam(value = "purchaseAdjustmentId", required = true) @RequestParam String purchaseAdjustmentId
+    ) throws RemoteServiceException {
+        WebsitPurchaseAdjustmentBean bean = websitPurchaseAdjustmentLogic.detail(purchaseAdjustmentId);
+        return ResponseHelper.success(bean);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation(value = "网点采购调整-添加")
+    public ResponseHelper<WebsitPurchaseAdjustmentBean> add(
+            @RequestBody WebsitPurchaseAdjustmentBean bean
+    ) throws Exception {
+        WebsitPurchaseAdjustmentBean result;
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + bean.getRef());
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            result = websitPurchaseAdjustmentLogic.add(bean);
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success(result);
+    }
+
+    @PostMapping("/update")
+    @ApiOperation(value = "修改采购调整单")
+    public ResponseHelper update(@RequestBody WebsitPurchaseAdjustmentBean purchaseAdjustmentBean) throws RemoteServiceException {
+        websitPurchaseAdjustmentLogic.update(purchaseAdjustmentBean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/submit")
+    @ApiOperation(value = "采购调整单提交")
+    public ResponseHelper submit(
+            @ApiParam(value = "采购调整单id",required = true) @RequestParam String purchaseAdjustmentId
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseAdjustmentId);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            websitPurchaseAdjustmentLogic.submit(purchaseAdjustmentId);
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/revoke")
+    @ApiOperation(value = "采购调整单撤消")
+    public ResponseHelper revoke(
+            @ApiParam(value = "采购调整单id",required = true) @RequestParam String purchaseAdjustmentId
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseAdjustmentId);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            websitPurchaseAdjustmentLogic.revoke(purchaseAdjustmentId);
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/del")
+    @ApiOperation(value = "采购调整单删除")
+    public ResponseHelper del(@ApiParam(value = "采购调整单id",required = true) @RequestParam String purchaseAdjustmentId)
+            throws RemoteServiceException {
+        websitPurchaseAdjustmentLogic.del(purchaseAdjustmentId);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/confirm")
+    @ApiOperation(value = "采购调整单审核")
+    public ResponseHelper confirm(
+            @ApiParam(value = "采购调整单id",required = true) @RequestParam String purchaseAdjustmentId
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseAdjustmentId);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            websitPurchaseAdjustmentLogic.confirm(purchaseAdjustmentId);
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+}

+ 335 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPurchaseAdjustmentLogic.java

@@ -0,0 +1,335 @@
+package com.gree.mall.manager.logic.material.manage;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.material.manage.WebsitPurchaseAdjustmentBean;
+import com.gree.mall.manager.bean.material.manage.WebsitPurchaseAdjustmentVO;
+import com.gree.mall.manager.bean.material.manage.WebsitPurchaseApplyVO;
+import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.enums.material.MaterialFlagEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.logic.material.stock.WebitPurchaseStockLogic;
+import com.gree.mall.manager.plus.entity.*;
+import com.gree.mall.manager.plus.service.*;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WebsitPurchaseAdjustmentLogic {
+
+    private final CommonLogic commonLogic;
+    private final MaterialMapper materialMapper;
+    private final WebsitPurchaseAdjustmentService websitPurchaseAdjustmentService;
+    private final WebsitPurchaseAdjustmentItemService websitPurchaseAdjustmentItemService;
+    private final WebsitPurchaseService websitPurchaseService;
+    private final WebsitPurchaseItemService websitPurchaseItemService;
+    private final WebsitGoodsService websitGoodsService;
+    private final WebitPurchaseStockLogic webitPurchaseStockLogic;
+
+    public IPage<WebsitPurchaseAdjustmentVO> page(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, WebsitPurchaseApplyVO.class, adminUser);
+
+        return materialMapper.websitPurchaseAdjustmentPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    public WebsitPurchaseAdjustmentBean detail(String purchaseAdjustmentId) {
+        final WebsitPurchaseAdjustment adjustment = websitPurchaseAdjustmentService.getById(purchaseAdjustmentId);
+        WebsitPurchaseAdjustmentBean bean = new WebsitPurchaseAdjustmentBean();
+        BeanUtils.copyProperties(adjustment, bean);
+        final List<WebsitPurchaseAdjustmentItem> items = websitPurchaseAdjustmentItemService.lambdaQuery()
+                .eq(WebsitPurchaseAdjustmentItem::getPurchaseAdjustmentId, purchaseAdjustmentId)
+                .list();
+        bean.setItems(items);
+        return bean;
+    }
+
+    @Transactional
+    public WebsitPurchaseAdjustmentBean add(WebsitPurchaseAdjustmentBean bean) {
+        WebsitPurchaseAdjustment existObj = websitPurchaseAdjustmentService.lambdaQuery()
+                .eq(WebsitPurchaseAdjustment::getRef, bean.getRef())
+                .lt(WebsitPurchaseAdjustment::getFlag, MaterialFlagEnum.OK.getKey())
+                .one();
+
+        if (Objects.nonNull(existObj)) {
+            throw new RemoteServiceException("发现一张未审核采购调整单单号为:" + existObj.getPurchaseAdjustmentId() + ",请先处理!");
+        }
+
+        // 获取采购订单信息
+        getPurchaseInfo(bean);
+
+        // 保存采购调整单
+        bean.insert();
+        // 保存采购调整单明细
+        websitPurchaseAdjustmentItemService.saveBatch(bean.getItems());
+
+        return bean;
+    }
+
+    private void getPurchaseInfo(WebsitPurchaseAdjustmentBean bean) throws RemoteServiceException {
+        bean.setPurchaseAdjustmentId(IdWorker.getIdStr());
+        // 获取采购订单信息
+        WebsitPurchase purchase = websitPurchaseService.lambdaQuery()
+                .eq(WebsitPurchase::getPurchaseId, bean.getRef())
+                .eq(WebsitPurchase::getWebsitId, bean.getWebsitId())
+                .eq(WebsitPurchase::getFlag, MaterialFlagEnum.OK.getKey())
+                .one();
+;
+
+        if (Objects.isNull(purchase)) {
+            throw new RemoteServiceException("找不到对应的采购订单:" + bean.getRef());
+        }
+
+        bean.setFlag(MaterialFlagEnum.SAVE.getKey());
+        bean.setPurchaseTime(purchase.getPurchaseTime());
+        bean.setStorageId(purchase.getStorageId());
+        bean.setStorageName(purchase.getStorageName());
+
+        // 获取采购订单明细信息
+        List<WebsitPurchaseItem> purchaseItemList = websitPurchaseItemService.lambdaQuery()
+                .eq(WebsitPurchaseItem::getPurchaseId, purchase.getPurchaseId())
+                .list();
+
+        List<WebsitPurchaseAdjustmentItem> adjustmentBeanItems = new ArrayList<>();
+
+        for (WebsitPurchaseItem item : purchaseItemList) {
+            WebsitPurchaseAdjustmentItem purchaseAdjustmentItem = new WebsitPurchaseAdjustmentItem();
+            purchaseAdjustmentItem.setPurchaseAdjustmentId(bean.getPurchaseAdjustmentId());
+            purchaseAdjustmentItem.setGoodsId(item.getGoodsId());
+            purchaseAdjustmentItem.setGoodsName(item.getGoodsName());
+            purchaseAdjustmentItem.setCost(item.getCost());
+            purchaseAdjustmentItem.setRecQty(item.getRecQty());
+            purchaseAdjustmentItem.setRecGiftQty(item.getRecGiftQty());
+            purchaseAdjustmentItem.setInStockCost(item.getInStockCost());
+            purchaseAdjustmentItem.setInStockQty(item.getInStockQty());
+            purchaseAdjustmentItem.setAdjustCost(item.getCost());
+            purchaseAdjustmentItem.setAdjustQty(item.getRecQty());
+            purchaseAdjustmentItem.setAdjustGiftQty(item.getRecGiftQty());
+            purchaseAdjustmentItem.setAdjustInStockCost(item.getInStockCost());
+            purchaseAdjustmentItem.setAdjustInStockQty(item.getInStockQty());
+            purchaseAdjustmentItem.setGoodsStockUnit(item.getGoodsStockUnit());
+            purchaseAdjustmentItem.setGoodsSpecification(item.getGoodsSpecification());
+            adjustmentBeanItems.add(purchaseAdjustmentItem);
+        }
+
+        bean.setItems(adjustmentBeanItems);
+    }
+
+    @Transactional
+    public void update(WebsitPurchaseAdjustmentBean purchaseAdjustmentBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        // 检查明细
+        this.validPurchaseItem(purchaseAdjustmentBean);
+        // 校验商品进价倍率并转换入库数量
+        this.validGoodsCost(purchaseAdjustmentBean);
+        // 更新主表
+        websitPurchaseAdjustmentService.lambdaUpdate()
+                .eq(WebsitPurchaseAdjustment::getPurchaseAdjustmentId, purchaseAdjustmentBean.getPurchaseAdjustmentId())
+                .eq(WebsitPurchaseAdjustment::getFlag, MaterialFlagEnum.SAVE.getKey())
+                .set(WebsitPurchaseAdjustment::getUpdateBy, adminUser.getNickName())
+                .set(WebsitPurchaseAdjustment::getUpdateTime, DateUtil.date())
+                .set(WebsitPurchaseAdjustment::getRemark, purchaseAdjustmentBean.getRemark())
+                .set(WebsitPurchaseAdjustment::getStorageId, purchaseAdjustmentBean.getStorageId())
+                .set(WebsitPurchaseAdjustment::getStorageName, purchaseAdjustmentBean.getStorageName())
+                .update();
+        // 更新明细
+        websitPurchaseAdjustmentItemService.updateBatchById(purchaseAdjustmentBean.getItems());
+    }
+
+    private void validPurchaseItem(WebsitPurchaseAdjustmentBean purchaseAdjustmentBean) throws RemoteServiceException {
+        // 过滤校验调整进价、调整数量少于等于0,调整增品数量少于0的明细
+        BigDecimal zeroVal = new BigDecimal("0");
+        List<WebsitPurchaseAdjustmentItem> existFilter = purchaseAdjustmentBean.getItems().stream()
+                .filter((item) ->
+                        item.getAdjustCost().compareTo(zeroVal) < 1
+                                || item.getAdjustQty().compareTo(zeroVal) < 1
+                                || item.getAdjustGiftQty().compareTo(zeroVal) < 0
+                ).collect(Collectors.toList());
+
+        if (existFilter.size() > 0) {
+            StringBuilder sb = new StringBuilder();
+            for (WebsitPurchaseAdjustmentItem purchaseAdjustmentItem : existFilter) {
+                sb.append(purchaseAdjustmentItem.getGoodsId())
+                        .append(" ")
+                        .append(purchaseAdjustmentItem.getGoodsName())
+                        .append(":");
+                if (purchaseAdjustmentItem.getAdjustCost().compareTo(zeroVal) < 1) {
+                    sb.append("调整进价不能少于等于0;");
+                }
+                if (purchaseAdjustmentItem.getAdjustQty().compareTo(zeroVal) < 1) {
+                    sb.append("调整数量不能少于等于0;");
+                }
+                if (purchaseAdjustmentItem.getAdjustGiftQty().compareTo(zeroVal) < 0) {
+                    sb.append("调整赠品数量不能少于0;");
+                }
+                sb.append("<br/><br/>");
+            }
+            sb.delete(sb.length()-10, sb.length());
+            throw new RemoteServiceException(sb.toString());
+        }
+
+        // 查询明细表信息
+        List<WebsitPurchaseAdjustmentItem> purchaseAdjustmentItems = websitPurchaseAdjustmentItemService.lambdaQuery()
+                .eq(WebsitPurchaseAdjustmentItem::getPurchaseAdjustmentId, purchaseAdjustmentBean.getPurchaseAdjustmentId())
+                .list();
+
+        Map<String, WebsitPurchaseAdjustmentItem> goodsMap = purchaseAdjustmentBean.getItems().stream()
+                .collect(Collectors.toMap((p) -> p.getPurchaseAdjustmentId() + "|" + p.getGoodsId(), Function.identity(), (key1, key2) -> key2));
+
+        for (WebsitPurchaseAdjustmentItem realItem : purchaseAdjustmentItems) {
+            WebsitPurchaseAdjustmentItem item = goodsMap.get(realItem.getPurchaseAdjustmentId() + "|" + realItem.getGoodsId());
+            realItem.setAdjustCost(item.getAdjustCost());
+            realItem.setAdjustQty(item.getAdjustQty());
+            realItem.setAdjustGiftQty(item.getAdjustGiftQty());
+        }
+
+        purchaseAdjustmentBean.setItems(purchaseAdjustmentItems);
+    }
+
+    private void validGoodsCost(WebsitPurchaseAdjustmentBean purchaseAdjustmentBean) throws RemoteServiceException {
+        List<WebsitGoods> list = websitGoodsService.lambdaQuery()
+                .in(WebsitGoods::getGoodsId, purchaseAdjustmentBean.getItems().stream()
+                        .map(WebsitPurchaseAdjustmentItem::getGoodsId)
+                        .collect(Collectors.toList()))
+                .list();
+
+        Map<String, WebsitGoods> goodsMap = list.stream()
+                .collect(Collectors.toMap(WebsitGoods::getGoodsId, Function.identity(), (key1, key2) -> key2));
+
+        for (int i = 0; i < purchaseAdjustmentBean.getItems().size(); i++) {
+            WebsitPurchaseAdjustmentItem item = purchaseAdjustmentBean.getItems().get(i);
+            WebsitGoods goods = goodsMap.get(item.getGoodsId());
+            String preStr = "第" + (i+1) + "行, ";
+            if (Objects.nonNull(goods.getCostRangeMini())
+                    && item.getAdjustCost().compareTo(goods.getCostRangeMini()) < 0) {
+                throw new RemoteServiceException(preStr + "不能低于辅材资料最小进价范围值");
+            }
+            if (Objects.nonNull(goods.getCostRangeMax())
+                    && item.getAdjustCost().compareTo(goods.getCostRangeMax()) > 0) {
+                throw new RemoteServiceException(preStr + "不能高于辅材资料最大进价范围值");
+            }
+
+            item.setAdjustInStockCost(item.getAdjustCost());
+            item.setAdjustInStockQty(item.getAdjustQty().add(item.getAdjustGiftQty()));
+        }
+
+    }
+
+    @Transactional
+    public void submit(String purchaseAdjustmentId) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        websitPurchaseAdjustmentService.lambdaUpdate()
+                .eq(WebsitPurchaseAdjustment::getPurchaseAdjustmentId, purchaseAdjustmentId)
+                .eq(WebsitPurchaseAdjustment::getFlag, MaterialFlagEnum.SAVE.getKey())
+                .set(WebsitPurchaseAdjustment::getFlag, MaterialFlagEnum.SUBMIT.getKey())
+                .set(WebsitPurchaseAdjustment::getSubmitBy, adminUser.getNickName())
+                .set(WebsitPurchaseAdjustment::getSubmitTime, DateUtil.date())
+                .update();
+    }
+
+    @Transactional
+    public void revoke(String purchaseAdjustmentId) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        websitPurchaseAdjustmentService.lambdaUpdate()
+                .eq(WebsitPurchaseAdjustment::getPurchaseAdjustmentId, purchaseAdjustmentId)
+                .eq(WebsitPurchaseAdjustment::getFlag, MaterialFlagEnum.SUBMIT.getKey())
+                .set(WebsitPurchaseAdjustment::getFlag, MaterialFlagEnum.SAVE.getKey())
+                .set(WebsitPurchaseAdjustment::getUpdateBy, adminUser.getNickName())
+                .set(WebsitPurchaseAdjustment::getUpdateTime, DateUtil.date())
+                .update();
+    }
+
+    @Transactional
+    public void del(String purchaseAdjustmentId) {
+        websitPurchaseAdjustmentService.lambdaUpdate()
+                .eq(WebsitPurchaseAdjustment::getPurchaseAdjustmentId, purchaseAdjustmentId)
+                .eq(WebsitPurchaseAdjustment::getFlag, MaterialFlagEnum.SAVE.getKey())
+                .remove();
+
+        websitPurchaseAdjustmentItemService.lambdaUpdate()
+                .eq(WebsitPurchaseAdjustmentItem::getPurchaseAdjustmentId, purchaseAdjustmentId)
+                .remove();
+    }
+
+    @Transactional
+    public void confirm(String purchaseAdjustmentId) throws Exception {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        final boolean update = websitPurchaseAdjustmentService.lambdaUpdate()
+                .eq(WebsitPurchaseAdjustment::getPurchaseAdjustmentId, purchaseAdjustmentId)
+                .eq(WebsitPurchaseAdjustment::getFlag, MaterialFlagEnum.SUBMIT.getKey())
+                .set(WebsitPurchaseAdjustment::getFlag, MaterialFlagEnum.OK.getKey())
+                .set(WebsitPurchaseAdjustment::getConfirmBy, adminUser.getNickName())
+                .set(WebsitPurchaseAdjustment::getConfirmTime, DateUtil.date())
+                .update();
+
+        if (!update) {
+            throw new RemoteServiceException("单据不存在或状态已发生变化");
+        }
+        WebsitPurchaseAdjustment purchaseAdjustment = websitPurchaseAdjustmentService.getById(purchaseAdjustmentId);
+
+        // 获取调整明细
+        List<WebsitPurchaseAdjustmentItem> purchaseAdjustmentItems = websitPurchaseAdjustmentItemService.lambdaQuery()
+                .eq(WebsitPurchaseAdjustmentItem::getPurchaseAdjustmentId, purchaseAdjustment.getPurchaseAdjustmentId())
+                .list();
+
+        // 调整明细转为Map
+        Map<String, WebsitPurchaseAdjustmentItem> goodsMap = purchaseAdjustmentItems.stream()
+                .collect(Collectors.toMap(WebsitPurchaseAdjustmentItem::getGoodsId, Function.identity(), (key1, key2) -> key2));
+
+        // 获取采购明细
+        List<WebsitPurchaseItem> purchaseItems = websitPurchaseItemService.lambdaQuery()
+                .eq(WebsitPurchaseItem::getPurchaseId, purchaseAdjustment.getRef())
+                .list();
+
+        List<WebsitPurchaseItem> changePurchaseList = new ArrayList<>();
+        List<WebsitPurchaseAdjustmentItem> changeAdjustList = new ArrayList<>();
+
+        // 遍历修改采购明细
+        for (WebsitPurchaseItem purchaseItem : purchaseItems) {
+            WebsitPurchaseAdjustmentItem item = goodsMap.get("" + purchaseItem.getGoodsId());
+
+            if (purchaseItem.getCost().compareTo(item.getAdjustCost()) != 0
+                    || purchaseItem.getRecQty().compareTo(item.getAdjustQty()) != 0
+                    || purchaseItem.getRecGiftQty().compareTo(item.getAdjustGiftQty()) != 0) {
+                // 进价或验收数量或验收赠品数量不等时执行变更
+                purchaseItem.setCost(item.getAdjustCost());
+                purchaseItem.setRecQty(item.getAdjustQty());
+                purchaseItem.setRecGiftQty(item.getAdjustGiftQty());
+                purchaseItem.setCostValue(item.getRecQty()
+                        .multiply(item.getCost())
+                        .setScale(2, BigDecimal.ROUND_DOWN));
+                purchaseItem.setInStockQty(item.getAdjustInStockQty());
+                purchaseItem.setInStockCost(item.getAdjustInStockCost());
+                changePurchaseList.add(purchaseItem);
+                changeAdjustList.add(item);
+            }
+        }
+
+        // 更改采购明细信息
+        websitPurchaseItemService.updateBatchById(changePurchaseList);
+
+        if (changeAdjustList.size() > 0) {
+            // 处理库存
+            webitPurchaseStockLogic.adjustmentStock(purchaseAdjustment, changeAdjustList, "采购调整");
+        }
+    }
+}

+ 62 - 1
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/stock/WebitPurchaseStockLogic.java

@@ -5,6 +5,7 @@ import com.gree.mall.manager.bean.admin.AdminUserCom;
 import com.gree.mall.manager.bean.material.stock.WebsitStockDTO;
 import com.gree.mall.manager.enums.material.DirectFlagEnum;
 import com.gree.mall.manager.enums.material.PartsAttrEnum;
+import com.gree.mall.manager.enums.material.WebsitGoodsTypeEnum;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.plus.entity.*;
 import com.gree.mall.manager.plus.service.StorageService;
@@ -50,7 +51,7 @@ public class WebitPurchaseStockLogic {
             websitStockDTO.setPrice(websitPurchaseItem.getCost());
             websitStockDTO.setRef(websitPurchaseItem.getPurchaseId());
             websitStockDTO.setRefType(refType);
-            websitStockDTO.setChangeQty(websitPurchaseItem.getRecQty());
+            websitStockDTO.setChangeQty(websitPurchaseItem.getInStockQty());
             websitStockDTO.setDirectFlag(DirectFlagEnum.ADD.getKey());
             websitStockDTO.setRemark(purchase.getRemark());
             websitStockDTO.setOperateBy(purchase.getConfirmBy());
@@ -99,6 +100,64 @@ public class WebitPurchaseStockLogic {
         websitGoodsStockLogic.handleWebsitStock(shopStockDTOS);
     }
 
+    public void adjustmentStock(WebsitPurchaseAdjustment purchaseAdjustment, List<WebsitPurchaseAdjustmentItem> changeAdjustList, String refType) throws Exception {
+        List<WebsitStockDTO> shopStockDTOS = new ArrayList<>();
+        for (WebsitPurchaseAdjustmentItem adjustmentItem : changeAdjustList) {
+            // 入库注值
+            WebsitStockDTO subStockDTO = new WebsitStockDTO();
+            subStockDTO.setCompanyWechatId(purchaseAdjustment.getCompanyWechatId());
+            subStockDTO.setCompanyWechatName(purchaseAdjustment.getCompanyWechatName());
+            subStockDTO.setWebsitId(purchaseAdjustment.getWebsitId());
+            subStockDTO.setWebsitName(purchaseAdjustment.getWebsitName());
+            subStockDTO.setSdate(purchaseAdjustment.getCreateTime());
+            subStockDTO.setPartsAttr(PartsAttrEnum.NEW.toString());
+            subStockDTO.setGoodsId(adjustmentItem.getGoodsId());
+            subStockDTO.setGoodsName(adjustmentItem.getGoodsName());
+            subStockDTO.setGoodsType(WebsitGoodsTypeEnum.M.getKey());
+            subStockDTO.setPrice(adjustmentItem.getCost());
+            subStockDTO.setRef(adjustmentItem.getPurchaseAdjustmentId());
+            subStockDTO.setRefType(refType);
+            subStockDTO.setChangeQty(adjustmentItem.getInStockQty());
+            subStockDTO.setDirectFlag(DirectFlagEnum.SUB.getKey());
+            subStockDTO.setRemark(purchaseAdjustment.getRemark());
+            subStockDTO.setOperateBy(purchaseAdjustment.getConfirmBy());
+            subStockDTO.setOperateTime(purchaseAdjustment.getConfirmTime());
+            subStockDTO.setObj("供应商");
+            subStockDTO.setStorageId(purchaseAdjustment.getStorageId());
+            shopStockDTOS.add(subStockDTO);
+
+            WebsitStockDTO addStockDTO = new WebsitStockDTO();
+            addStockDTO.setCompanyWechatId(purchaseAdjustment.getCompanyWechatId());
+            addStockDTO.setCompanyWechatName(purchaseAdjustment.getCompanyWechatName());
+            addStockDTO.setWebsitId(purchaseAdjustment.getWebsitId());
+            addStockDTO.setWebsitName(purchaseAdjustment.getWebsitName());
+            addStockDTO.setSdate(purchaseAdjustment.getCreateTime());
+            addStockDTO.setPartsAttr(PartsAttrEnum.NEW.toString());
+            addStockDTO.setGoodsId(adjustmentItem.getGoodsId());
+            addStockDTO.setGoodsName(adjustmentItem.getGoodsName());
+            addStockDTO.setGoodsType(WebsitGoodsTypeEnum.M.getKey());
+            addStockDTO.setPrice(adjustmentItem.getAdjustCost());
+            addStockDTO.setRef(adjustmentItem.getPurchaseAdjustmentId());
+            addStockDTO.setRefType(refType);
+            addStockDTO.setChangeQty(adjustmentItem.getAdjustInStockQty());
+            addStockDTO.setDirectFlag(DirectFlagEnum.ADD.getKey());
+            addStockDTO.setRemark(purchaseAdjustment.getRemark());
+            addStockDTO.setOperateBy(purchaseAdjustment.getConfirmBy());
+            addStockDTO.setOperateTime(purchaseAdjustment.getConfirmTime());
+            addStockDTO.setObj("供应商");
+            addStockDTO.setStorageId(purchaseAdjustment.getStorageId());
+            addStockDTO.setPurchaseId(purchaseAdjustment.getRef());
+            shopStockDTOS.add(addStockDTO);
+        }
+
+        if (CollectionUtil.isEmpty(shopStockDTOS)) {
+            return;
+        }
+
+        // 开始处理库存
+        websitGoodsStockLogic.handleWebsitStock(shopStockDTOS);
+    }
+
     public Storage handleStorage(AdminUserCom adminUser, String websitId, String goodsType, String storageId) {
 //        String storageType = goodsType.equals(WebsitGoodsTypeEnum.M.getKey()) ? WebsitGoodsTypeEnum.M.getRemark() : WebsitGoodsTypeEnum.P.getRemark();
 //        if (adminUser.getAdminCompanyWechat().getJoinCode().equals("NO")) {
@@ -135,4 +194,6 @@ public class WebitPurchaseStockLogic {
 
         return storage;
     }
+
+
 }

+ 16 - 8
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/stock/WebsitGoodsStockLogic.java

@@ -5,15 +5,10 @@ import com.gree.mall.manager.bean.material.stock.WebsitStockDTO;
 import com.gree.mall.manager.bean.material.stock.WorkerStockDTO;
 import com.gree.mall.manager.commonmapper.WebsitStockCMapper;
 import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.enums.material.DirectFlagEnum;
 import com.gree.mall.manager.exception.RemoteServiceException;
-import com.gree.mall.manager.plus.entity.WebsitStock;
-import com.gree.mall.manager.plus.entity.WebsitStockAcc;
-import com.gree.mall.manager.plus.entity.WorkerStock;
-import com.gree.mall.manager.plus.entity.WorkerStockAcc;
-import com.gree.mall.manager.plus.service.WebsitStockAccService;
-import com.gree.mall.manager.plus.service.WebsitStockService;
-import com.gree.mall.manager.plus.service.WorkerStockAccService;
-import com.gree.mall.manager.plus.service.WorkerStockService;
+import com.gree.mall.manager.plus.entity.*;
+import com.gree.mall.manager.plus.service.*;
 import com.gree.mall.manager.utils.ValidateUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -45,6 +40,7 @@ public class WebsitGoodsStockLogic {
     private final WebsitStockAccService websitStockAccService;
     private final WorkerStockService workerStockService;
     private final WorkerStockAccService workerStockAccService;
+    private final WebsitPurchaseService websitPurchaseService;
 
     /**
      * 单个网点库存处理
@@ -225,6 +221,18 @@ public class WebsitGoodsStockLogic {
             if (websitStockDTO.getRefType().equals("采购入库")) {
                 shopStock.setLastCost(websitStockDTO.getPrice());
             }
+            if (websitStockDTO.getRefType().equals("采购调整")
+                    && websitStockDTO.getDirectFlag().equals(DirectFlagEnum.ADD.getKey())) {
+                // 如果是采购调整并且方向是增加检查是否需要注入最后一次采购价
+                final WebsitPurchase purchase = websitPurchaseService.lambdaQuery()
+                        .select(WebsitPurchase::getPurchaseId)
+                        .orderByDesc(WebsitPurchase::getConfirmTime)
+                        .last("limit 1")
+                        .one();
+                if (purchase.getPurchaseId().equals(websitStockDTO.getPurchaseId())) {
+                    shopStock.setLastCost(websitStockDTO.getPrice());
+                }
+            }
         }
         return existStockMap;
     }

+ 19 - 0
mall-server-api/src/main/resources/mapper/MaterialMapper.xml

@@ -483,4 +483,23 @@
         </if>
         ${ex.orderBy}
     </select>
+
+    <select id="websitPurchaseAdjustmentPage"
+            resultType="com.gree.mall.manager.bean.material.manage.WebsitPurchaseAdjustmentVO">
+        SELECT
+            ${ex.selected}
+        FROM
+            websit_purchase_adjustment a
+        ${ex.query}
+        <if test="ex.adminWebsitIds != null and ex.adminWebsitIds.size > 0">
+            AND a.websit_id IN
+            <foreach item="item" index="index" collection="ex.adminWebsitIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
 </mapper>