Просмотр исходного кода

1.网点采购订单审核
2.辅材模板增加最小最大进价值

FengChaoYu 8 месяцев назад
Родитель
Сommit
c92e458625

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

@@ -82,4 +82,9 @@ public class WebsitMPurchaseItemBean {
     @ApiModelProperty(value = "备注")
     private String note;
 
+    @ApiModelProperty(value = "入库数量")
+    private BigDecimal inStockQty;
+
+    @ApiModelProperty(value = "入库进价")
+    private BigDecimal inStockCost;
 }

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

@@ -0,0 +1,83 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.IsYesNoEnum;
+import com.gree.mall.manager.enums.material.MaterialFlagEnum;
+import com.gree.mall.manager.enums.material.WebsitGoodsTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@ApiModel
+@Data
+@ZfireField(tbName = "a")
+public class WebsitPurchaseOrderVO {
+    @ApiModelProperty(value = "单号")
+    private String purchaseId;
+
+    @ApiModelProperty(value = "商户名称")
+    private String companyWechatName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "网点编号")
+    private String websitId;
+
+    @ApiModelProperty(value = "网点名称")
+    private String websitName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "商品类型")
+    private WebsitGoodsTypeEnum goodsType;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "供应商编号")
+    private String venderId;
+
+    @ApiModelProperty(value = "供应商名称")
+    private String venderName;
+
+    @ApiModelProperty(value = "采购总金额")
+    private String totalAmount;
+
+    @ApiModelProperty(value = "单据状态")
+    private MaterialFlagEnum flag;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "是否核实")
+    private IsYesNoEnum isRecheck;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "核实备注")
+    private String checkRemark;
+
+    @ApiModelProperty(value = "审核备注")
+    private String confirmRemark;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "核实人")
+    private String checkBy;
+
+    @ApiModelProperty(value = "核实时间")
+    private Date checkTime;
+
+    @ApiModelProperty(value = "审核人")
+    private String confirmBy;
+
+    @ApiModelProperty(value = "审核时间")
+    private Date confirmTime;
+}

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

@@ -234,4 +234,12 @@ public interface MaterialMapper {
      * @return
      */
     IPage<WebsitPurchaseCheckVO> websitPurchaseCheckPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 采购订单列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WebsitPurchaseOrderVO> websitPurchaseOrderPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
 }

+ 8 - 14
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPurchaseApplyController.java

@@ -100,16 +100,13 @@ public class WebsitPurchaseApplyController {
     @PostMapping("/revoke")
     @ApiOperation(value = "网点采购申请-撤消")
     public ResponseHelper revoke(@ApiParam(value = "采购申请单id",required = true) @RequestParam String purchaseId)
-            throws RemoteServiceException {
+            throws Exception {
         Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseId);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
         try {
-            if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
-                log.error("获取采购申请单锁超时!");
-            }
             websitMPurchaseLogic.revoke(purchaseId, 1);
-        } catch (InterruptedException e) {
-            log.error(purchaseId + " 撤消失败!", e);
-            throw new RemoteServiceException(purchaseId + " 撤消失败!" + e.getMessage());
         } finally {
             obtain.unlock();
         }
@@ -119,16 +116,13 @@ public class WebsitPurchaseApplyController {
     @PostMapping("/submit")
     @ApiOperation(value = "网点采购申请-提交")
     public ResponseHelper submit(@ApiParam(value = "采购申请单id",required = true) @RequestParam String purchaseId)
-            throws RemoteServiceException {
+            throws Exception {
         Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseId);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
         try {
-            if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
-                log.error("获取采购申请单锁超时!");
-            }
             websitMPurchaseLogic.submit(purchaseId);
-        } catch (InterruptedException e) {
-            log.error(purchaseId + " 提交失败!", e);
-            throw new RemoteServiceException(purchaseId + " 提交失败!" + e.getMessage());
         } finally {
             obtain.unlock();
         }

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

@@ -3,12 +3,15 @@ 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.WebsitMPurchaseBean;
 import com.gree.mall.manager.bean.material.manage.WebsitPurchaseBean;
+import com.gree.mall.manager.bean.material.manage.WebsitPurchaseOrderVO;
 import com.gree.mall.manager.bean.material.manage.WebsitPurchaseVO;
 import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.enums.material.MaterialFlagEnum;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.material.manage.WebsitMPurchaseLogic;
 import com.gree.mall.manager.logic.material.manage.WebsitPurchaseLogic;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import com.gree.mall.manager.zfire.util.FieldUtils;
@@ -41,6 +44,8 @@ public class WebsitPurchaseController {
     WebsitPurchaseLogic websitPurchaseLogic;
     @Resource
     RedisLockRegistry redisLockRegistry;
+    @Resource
+    WebsitMPurchaseLogic websitMPurchaseLogic;
 
     @ZfireList
     @PostMapping("/list")
@@ -133,4 +138,76 @@ public class WebsitPurchaseController {
     ) throws Exception {
         return ResponseHelper.success(websitPurchaseLogic.importData(file, goodsType));
     }
+
+    @ZfireList
+    @PostMapping("/order/list")
+    @ApiOperation(value = "网点采购订单-列表")
+    public ResponseHelper<IPage<WebsitPurchaseOrderVO>> orderPage(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<WebsitPurchaseOrderVO> page = websitPurchaseLogic.orderPage(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<WebsitPurchaseOrderVO>() {});
+    }
+
+    @PostMapping("/order/list/export")
+    @ApiOperation("网点采购订单-导出")
+    public void orderListExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<WebsitPurchaseOrderVO> baseVOIPage = websitPurchaseLogic.orderPage(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(baseVOIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/order/detail")
+    @ApiOperation(value = "网点采购订单-详情")
+    public ResponseHelper<WebsitMPurchaseBean> orderDetail(
+            @ApiParam(value = "purchaseId", required = true) @RequestParam String purchaseId
+    ) throws RemoteServiceException {
+        final WebsitMPurchaseBean bean = websitMPurchaseLogic.detail(purchaseId);
+        return ResponseHelper.success(bean);
+    }
+
+    @PostMapping("/order/update")
+    @ApiOperation(value = "网点采购订单-修改")
+    public ResponseHelper update(@RequestBody WebsitMPurchaseBean bean) throws RemoteServiceException {
+        websitMPurchaseLogic.orderUpdate(bean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/order/revoke")
+    @ApiOperation(value = "网点采购订单-作废")
+    public ResponseHelper orderRevoke(@ApiParam(value = "采购申请单id",required = true) @RequestParam String purchaseId)
+            throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseId);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            websitMPurchaseLogic.orderRevoke(purchaseId);
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/order/confirm")
+    @ApiOperation(value = "网点采购订单-审核")
+    public ResponseHelper orderConfirm(@ApiParam(value = "采购申请单id",required = true) @RequestParam String purchaseId)
+            throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseId);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
+        try {
+            websitMPurchaseLogic.orderConfirm(purchaseId);
+        } finally {
+            obtain.unlock();
+        }
+        return ResponseHelper.success();
+    }
 }

+ 8 - 14
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/vender/VenderCheckPurchaseController.java

@@ -77,16 +77,13 @@ public class VenderCheckPurchaseController {
     @PostMapping("/revoke")
     @ApiOperation(value = "核实采购-撤消")
     public ResponseHelper revoke(@ApiParam(value = "采购申请单id",required = true) @RequestParam String purchaseId)
-            throws RemoteServiceException {
+            throws Exception {
         Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseId);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
         try {
-            if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
-                log.error("获取采购申请单锁超时!");
-            }
             websitMPurchaseLogic.revoke(purchaseId, 2);
-        } catch (InterruptedException e) {
-            log.error(purchaseId + " 撤消失败!", e);
-            throw new RemoteServiceException(purchaseId + " 撤消失败!" + e.getMessage());
         } finally {
             obtain.unlock();
         }
@@ -97,16 +94,13 @@ public class VenderCheckPurchaseController {
     @PostMapping("/verify")
     @ApiOperation(value = "核实采购-核实")
     public ResponseHelper verify(@ApiParam(value = "采购申请单id",required = true) @RequestParam String purchaseId)
-            throws RemoteServiceException {
+            throws Exception {
         Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseId);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("系统繁忙,请稍后再尝试");
+        }
         try {
-            if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
-                log.error("获取采购申请单锁超时!");
-            }
             websitMPurchaseLogic.verify(purchaseId);
-        } catch (InterruptedException e) {
-            log.error(purchaseId + " 核实失败!", e);
-            throw new RemoteServiceException(purchaseId + " 核实失败!" + e.getMessage());
         } finally {
             obtain.unlock();
         }

+ 2 - 2
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/MaterialFlagEnum.java

@@ -13,9 +13,9 @@ import lombok.RequiredArgsConstructor;
 public enum MaterialFlagEnum implements BaseEnum {
 
     SAVE("SAVE","保存"),
-    OK("OK","通过"),
-    FAIL("FAIL","失败"),
     SUBMIT("SUBMIT","提交"),
+    OK("OK","通过"),
+    CANCEL("CANCEL","作废"),
     ;
 
     @EnumValue

+ 16 - 18
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/base/WebsitGoodsLogic.java

@@ -411,19 +411,7 @@ public class WebsitGoodsLogic {
 
         for (int i = 0; i < objects.size(); i++) {
             List<Object> row = (List<Object>) objects.get(i);
-            CommonUtils.initList2(row, 12);
-            if (row.size() < 8) {
-                row.add(null);
-                row.add(null);
-                row.add(null);
-            }
-            if (row.size() < 9) {
-                row.add(null);
-                row.add(null);
-            }
-            if (row.size() < 10) {
-                row.add(null);
-            }
+            CommonUtils.initList2(row, 14);
             if (Objects.isNull(row.get(0))) {
                 throw new RemoteServiceException("第" + (i+1) + "行, 大类不能为空");
             }
@@ -448,6 +436,12 @@ public class WebsitGoodsLogic {
             if (Objects.isNull(row.get(7))) {
                 throw new RemoteServiceException("第" + (i+1) + "行, 销售价格不能为空");
             }
+            if (Objects.isNull(row.get(8))) {
+                throw new RemoteServiceException("第" + (i+1) + "行, 进价最小值不能为空");
+            }
+            if (Objects.isNull(row.get(9))) {
+                throw new RemoteServiceException("第" + (i+1) + "行, 进价最大值不能为空");
+            }
 
             String parentCategoryStr = (String) row.get(0);
             String categoryStr = (String) row.get(1);
@@ -456,11 +450,13 @@ public class WebsitGoodsLogic {
             String saleUnitStr = (String) row.get(4);
             String costStr = (String) row.get(5);
             String salesStr = (String) row.get(6);
-            String goodsCodeStr = (String) row.get(7);
-            String specificationStr = (String) row.get(8);
-            String remark = (String) row.get(9);
-            String manageWorkerStock = (String) row.get(10);
-            String salesConvertQty = (String) row.get(11);
+            String costMiniStr = (String) row.get(7);
+            String costMaxStr = (String) row.get(8);
+            String goodsCodeStr = (String) row.get(9);
+            String specificationStr = (String) row.get(10);
+            String remark = (String) row.get(11);
+            String manageWorkerStock = (String) row.get(12);
+            String salesConvertQty = (String) row.get(13);
 
             if (!treeMap.containsKey(parentCategoryStr)) {
                 throw new RemoteServiceException("第" + (i+1) + "行, 大类信息不存在");
@@ -508,6 +504,8 @@ public class WebsitGoodsLogic {
             goods.setRemark(remark);
             goods.setCost(new BigDecimal(costStr));
             goods.setMarketPrice(new BigDecimal(salesStr));
+            goods.setCostRangeMini(new BigDecimal(costMiniStr));
+            goods.setCostRangeMax(new BigDecimal(costMaxStr));
 
             goods.setGoodsStockUnit(StrUtil.trim(unitStr));
             goods.setGoodsSalesUnit(StrUtil.trim(saleUnitStr));

+ 219 - 17
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitMPurchaseLogic.java

@@ -12,19 +12,17 @@ import com.gree.mall.manager.bean.material.manage.WebsitPurchaseApplyVO;
 import com.gree.mall.manager.bean.material.vender.WebsitPurchaseCheckVO;
 import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsRelaVO;
 import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.enums.IsEnum;
 import com.gree.mall.manager.enums.IsYesNoEnum;
 import com.gree.mall.manager.enums.material.MaterialFlagEnum;
 import com.gree.mall.manager.enums.material.StateEnum;
 import com.gree.mall.manager.enums.material.WebsitGoodsTypeEnum;
 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.logic.material.vender.VenderGoodsLogic;
-import com.gree.mall.manager.plus.entity.WebsitPurchase;
-import com.gree.mall.manager.plus.entity.WebsitPurchaseItem;
-import com.gree.mall.manager.plus.entity.WebsitVender;
-import com.gree.mall.manager.plus.service.WebsitPurchaseItemService;
-import com.gree.mall.manager.plus.service.WebsitPurchaseService;
-import com.gree.mall.manager.plus.service.WebsitVenderService;
+import com.gree.mall.manager.plus.entity.*;
+import com.gree.mall.manager.plus.service.*;
 import com.gree.mall.manager.zfire.bean.QueryParamBean;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import com.gree.mall.manager.zfire.util.FieldUtils;
@@ -51,6 +49,10 @@ public class WebsitMPurchaseLogic {
     private final WebsitPurchaseItemService websitPurchaseItemService;
     private final VenderGoodsLogic venderGoodsLogic;
     private final WebsitVenderService websitVenderService;
+    private final StorageService storageService;
+    private final WebitPurchaseStockLogic webitPurchaseStockLogic;
+    private final WebsitGoodsService websitGoodsService;
+    private final WebsitGoodsPriceService websitGoodsPriceService;
 
     public IPage<WebsitPurchaseApplyVO> page(ZfireParamBean zfireParamBean) {
         AdminUserCom adminUser = commonLogic.getAdminUser();
@@ -220,18 +222,33 @@ public class WebsitMPurchaseLogic {
                         && itemBean.getApplyCost().compareTo(relaGoods.getCostRangeMax()) > 0) {
                     throw new RemoteServiceException(preStr + "不能高于辅材资料最大进价范围值");
                 }
+                // 申请进价*申请数量=申请进价金额
+                itemBean.setApplyCostValue(itemBean.getApplyCost().multiply(itemBean.getApplyQty()).setScale(2, BigDecimal.ROUND_DOWN));
+                itemBean.setCheckQty(itemBean.getApplyCost());
+                itemBean.setGoodsCode(relaGoods.getGoodsCode());
+                itemBean.setGoodsSpecification(relaGoods.getGoodsSpecification());
+                itemBean.setGoodsStockUnit(relaGoods.getGoodsStockUnit());
+                itemBean.setParentCategoryId(relaGoods.getParentCategoryId());
+                itemBean.setParentCategoryName(relaGoods.getParentCategoryName());
+                itemBean.setGoodsCategoryId(relaGoods.getGoodsCategoryId());
+                itemBean.setGoodsCategoryName(relaGoods.getCategoryName());
+                bean.setTotalAmount(bean.getTotalAmount().add(itemBean.getApplyCostValue()));
+            } else if (bean.getFlag().equals(MaterialFlagEnum.SUBMIT.getKey())) {
+                // 检查进价范围值
+                if (Objects.nonNull(relaGoods.getCostRangeMini())
+                        && itemBean.getCost().compareTo(relaGoods.getCostRangeMini()) < 0) {
+                    throw new RemoteServiceException(preStr + "不能低于辅材资料最小进价范围值");
+                }
+                if (Objects.nonNull(relaGoods.getCostRangeMax())
+                        && itemBean.getCost().compareTo(relaGoods.getCostRangeMax()) > 0) {
+                    throw new RemoteServiceException(preStr + "不能高于辅材资料最大进价范围值");
+                }
+                itemBean.setInStockCost(itemBean.getCost());
+                itemBean.setInStockQty(itemBean.getRecQty().add(itemBean.getRecGiftQty()));
+                itemBean.setCostValue(itemBean.getRecQty().multiply(itemBean.getCost()).setScale(2, BigDecimal.ROUND_DOWN));
+                bean.setTotalAmount(bean.getTotalAmount().add(itemBean.getCostValue()));
             }
-            // 申请进价*申请数量=申请进价金额
-            itemBean.setApplyCostValue(itemBean.getApplyCost().multiply(itemBean.getApplyQty()).setScale(2, BigDecimal.ROUND_HALF_UP));
-            itemBean.setCheckQty(itemBean.getApplyCost());
-            itemBean.setGoodsCode(relaGoods.getGoodsCode());
-            itemBean.setGoodsSpecification(relaGoods.getGoodsSpecification());
-            itemBean.setGoodsStockUnit(relaGoods.getGoodsStockUnit());
-            itemBean.setParentCategoryId(relaGoods.getParentCategoryId());
-            itemBean.setParentCategoryName(relaGoods.getParentCategoryName());
-            itemBean.setGoodsCategoryId(relaGoods.getGoodsCategoryId());
-            itemBean.setGoodsCategoryName(relaGoods.getCategoryName());
-            bean.setTotalAmount(bean.getTotalAmount().add(itemBean.getApplyCostValue()));
+
         }
     }
 
@@ -363,4 +380,189 @@ public class WebsitMPurchaseLogic {
                 .set(WebsitPurchase::getCheckTime, DateUtil.date())
                 .update();
     }
+
+    @Transactional
+    public void orderUpdate(WebsitMPurchaseBean bean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitPurchase purchase = websitPurchaseService.getById(bean.getPurchaseId());
+
+        if (Objects.isNull(purchase)) {
+            throw new RemoteServiceException("单据不存在或状态已发生变化");
+        }
+
+        if (StringUtils.isBlank(bean.getImageUrl())) {
+            throw new RemoteServiceException("请添加附件图片");
+        }
+
+        if (Objects.isNull(bean.getPurchaseTime())) {
+            throw new RemoteServiceException("请选择采购日期");
+        }
+
+        final Storage storage = storageService.lambdaQuery()
+                .eq(Storage::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                .eq(Storage::getWebsitId, purchase.getWebsitId())
+                .eq(Storage::getIsDefault, IsEnum.Y.getValue())
+                .one();
+
+        List<WebsitPurchaseItem> purchaseItems = websitPurchaseItemService.lambdaQuery()
+                .eq(WebsitPurchaseItem::getPurchaseId, purchase.getPurchaseId())
+                .list();
+
+        if (StringUtils.isBlank(bean.getStorageId())) {
+            bean.setStorageId(storage.getStorageId());
+            bean.setStorageName(storage.getStorageName());
+        }
+
+        bean.setFlag(purchase.getFlag());
+        this.convertOrderParams(bean, purchase, purchaseItems);
+
+        purchase.updateById();
+        websitPurchaseItemService.saveOrUpdateBatch(purchaseItems);
+    }
+
+    @Transactional
+    public void orderRevoke(String purchaseId) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        websitPurchaseService.lambdaUpdate()
+                .eq(WebsitPurchase::getPurchaseId, purchaseId)
+                .eq(WebsitPurchase::getFlag, MaterialFlagEnum.SUBMIT.getKey())
+                .eq(WebsitPurchase::getIsRecheck, IsYesNoEnum.YES.getKey())
+                .set(WebsitPurchase::getUpdateBy, adminUser.getNickName())
+                .set(WebsitPurchase::getUpdateTime, DateUtil.date())
+                .set(WebsitPurchase::getFlag, MaterialFlagEnum.CANCEL.getKey())
+                .update();
+    }
+
+    private void convertOrderParams(WebsitMPurchaseBean bean, WebsitPurchase purchase, List<WebsitPurchaseItem> purchaseItems) {
+        // 获取供应商商品记录
+        List<WebsitVenderGoodsRelaVO> relaList = this.queryVenderGoods(bean);
+        final Map<String, WebsitVenderGoodsRelaVO> relaMap = relaList.stream()
+                .collect(Collectors.toMap(WebsitVenderGoodsRelaVO::getGoodsId, Function.identity()));
+
+        // 校验供应商商品
+        this.validVendorGoods(bean, relaMap);
+
+        final Map<String, WebsitMPurchaseItemBean> itemBeanMap = bean.getItems().stream()
+                .collect(Collectors.toMap(WebsitMPurchaseItemBean::getGoodsId, Function.identity()));
+
+        for (WebsitPurchaseItem item : purchaseItems) {
+            final WebsitMPurchaseItemBean itemBean = itemBeanMap.get(item.getGoodsId());
+            if (Objects.nonNull(itemBean)) {
+                item.setRecQty(itemBean.getRecQty())
+                        .setRecGiftQty(itemBean.getRecGiftQty())
+                        .setCost(itemBean.getCost())
+                        .setCostValue(itemBean.getCostValue())
+                        .setInStockCost(itemBean.getInStockCost())
+                        .setInStockQty(itemBean.getInStockQty());
+            }
+            purchase.setTotalAmount(purchase.getTotalAmount().add(item.getCostValue()));
+        }
+
+        purchase.setImageUrl(bean.getImageUrl())
+                .setPurchaseTime(bean.getPurchaseTime())
+                .setConfirmRemark(bean.getConfirmRemark());
+    }
+
+    @Transactional
+    public void orderConfirm(String purchaseId) throws Exception {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitPurchase purchase = websitPurchaseService.getById(purchaseId);
+        if (Objects.isNull(purchase)
+                || !StrUtil.equals(purchase.getFlag(), MaterialFlagEnum.SUBMIT.getKey())
+                || StrUtil.equals(purchase.getIsRecheck(), IsYesNoEnum.YES.getKey())) {
+            throw new RemoteServiceException("单据不存在或状态已发生变化");
+        }
+
+        final List<WebsitPurchaseItem> purchaseItems = websitPurchaseItemService.lambdaQuery()
+                .eq(WebsitPurchaseItem::getPurchaseId, purchase.getPurchaseId())
+                .list();
+
+        this.checkPurchaseItemsCount(purchase, purchaseItems);
+
+        purchase.setFlag(MaterialFlagEnum.OK.getKey())
+                .setConfirmBy(adminUser.getNickName())
+                .setConfirmTime(DateUtil.date())
+                .updateById();
+
+        // 库存处理
+        webitPurchaseStockLogic.newInStock(purchase, purchaseItems, "采购入库");
+
+        // 没有入库过的辅材增加售价为0记录
+        if (purchase.getGoodsType().equals(WebsitGoodsTypeEnum.M.getKey())) {
+            List<WebsitGoods> goodsList = websitGoodsService.lambdaQuery()
+                    .eq(WebsitGoods::getCompanyWechatId, purchase.getCompanyWechatId())
+                    .in(WebsitGoods::getGoodsId, purchaseItems.stream()
+                            .map(WebsitPurchaseItem::getGoodsId)
+                            .collect(Collectors.toList()))
+                    .list();
+
+            List<WebsitGoodsPrice> priceList = websitGoodsPriceService.lambdaQuery()
+                    .eq(WebsitGoodsPrice::getCompanyWechatId, purchase.getCompanyWechatId())
+                    .eq(WebsitGoodsPrice::getWebsitId, purchase.getWebsitId())
+                    .in(WebsitGoodsPrice::getGoodsId, purchaseItems.stream()
+                            .map(WebsitPurchaseItem::getGoodsId)
+                            .collect(Collectors.toList()))
+                    .list();
+            // 数量不相等
+            if (priceList.size() != purchaseItems.size()) {
+                List<WebsitGoodsPrice> createPriceList = new ArrayList<>();
+
+                Map<String, WebsitGoodsPrice> goodsPriceMap = priceList.stream()
+                        .collect(Collectors.toMap(WebsitGoodsPrice::getGoodsId, Function.identity(), (key1,key2) -> key2));
+
+                Map<String, BigDecimal> goodsMap = goodsList.stream()
+                        .collect(Collectors.toMap(WebsitGoods::getGoodsId, WebsitGoods::getMarketPrice, (key1,key2) -> key2));
+
+                for (WebsitPurchaseItem item : purchaseItems) {
+                    if (!goodsPriceMap.containsKey(item.getGoodsId())) {
+                        WebsitGoodsPrice price = new WebsitGoodsPrice();
+                        BigDecimal salesPrice = goodsMap.getOrDefault(item.getGoodsId(), BigDecimal.ZERO);
+                        price.setCompanyWechatId(item.getCompanyWechatId());
+                        price.setWebsitId(item.getWebsitId());
+                        price.setWebsitName(item.getWebsitName());
+                        price.setGoodsType(item.getGoodsType());
+                        price.setGoodsId(item.getGoodsId());
+                        price.setPrice(salesPrice);
+                        price.setSheetId("");
+                        price.setRemark(purchase.getRemark());
+
+                        createPriceList.add(price);
+                    }
+                }
+
+                if (CollectionUtil.isNotEmpty(createPriceList)) {
+                    websitGoodsPriceService.saveBatch(createPriceList);
+                }
+            }
+        }
+    }
+
+    private void checkPurchaseItemsCount(WebsitPurchase purchase, List<WebsitPurchaseItem> purchaseItems) {
+        BigDecimal zero = new BigDecimal("0");
+        List<WebsitPurchaseItem> zeroItems = purchaseItems.stream()
+                .filter(item -> item.getInStockQty().compareTo(zero) == 0)
+                .collect(Collectors.toList());
+
+        List<WebsitPurchaseItem> purchaseItemList = purchaseItems.stream()
+                .filter(item -> item.getRecQty().compareTo(item.getApplyQty()) > 0)
+                .collect(Collectors.toList());
+
+        if (zeroItems.size() == purchaseItems.size()) {
+            throw new RemoteServiceException("辅材验收数量为0,审核失败");
+        }
+
+        if (CollectionUtil.isNotEmpty(purchaseItemList)) {
+            throw new RemoteServiceException(purchaseItemList.get(0).getGoodsName() + " 辅材验收数量不能大于订货数量,审核失败");
+        }
+
+        BigDecimal rateQty = new BigDecimal("5");
+        for (WebsitPurchaseItem item : purchaseItems) {
+            BigDecimal resultRateQty = Optional.ofNullable(item.getRecGiftQty()).orElse(BigDecimal.ZERO)
+                    .divide(item.getApplyQty(), 4, BigDecimal.ROUND_HALF_UP)
+                    .multiply(new BigDecimal("100"));
+            if (resultRateQty.compareTo(rateQty) > 0) {
+                throw new RemoteServiceException(item.getGoodsName() + "的赠品数量不能超过订货数量的5%,审核失败");
+            }
+        }
+    }
 }

+ 8 - 3
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPurchaseLogic.java

@@ -6,9 +6,7 @@ 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.WebsitPurchaseBean;
-import com.gree.mall.manager.bean.material.manage.WebsitPurchaseItemBean;
-import com.gree.mall.manager.bean.material.manage.WebsitPurchaseVO;
+import com.gree.mall.manager.bean.material.manage.*;
 import com.gree.mall.manager.commonmapper.MaterialMapper;
 import com.gree.mall.manager.enums.admin.AdminWebsitTypeEnum;
 import com.gree.mall.manager.enums.material.MaterialFlagEnum;
@@ -502,4 +500,11 @@ public class WebsitPurchaseLogic {
         return "";
     }
 
+    public IPage<WebsitPurchaseOrderVO> orderPage(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, WebsitPurchaseOrderVO.class, adminUser);
+
+        return materialMapper.websitPurchaseOrderPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.gree.mall.manager.logic.material.stock;
 
+import cn.hutool.core.collection.CollectionUtil;
 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;
@@ -14,6 +15,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -31,6 +33,9 @@ public class WebitPurchaseStockLogic {
     public void newInStock(WebsitPurchase purchase, List<WebsitPurchaseItem> websitPurchaseItems, String refType) throws Exception {
         List<WebsitStockDTO> shopStockDTOS = new ArrayList<>();
         for (WebsitPurchaseItem websitPurchaseItem : websitPurchaseItems) {
+            if (websitPurchaseItem.getInStockQty().compareTo(BigDecimal.ZERO) <= 0) {
+                continue;
+            }
             // 入库注值
             WebsitStockDTO websitStockDTO = new WebsitStockDTO();
             websitStockDTO.setCompanyWechatId(websitPurchaseItem.getCompanyWechatId());
@@ -55,6 +60,10 @@ public class WebitPurchaseStockLogic {
             shopStockDTOS.add(websitStockDTO);
         }
 
+        if (CollectionUtil.isEmpty(shopStockDTOS)) {
+            return;
+        }
+
         // 开始处理库存
         websitGoodsStockLogic.handleWebsitStock(shopStockDTOS);
     }

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

@@ -435,6 +435,8 @@
                 #{item}
             </foreach>
         </if>
+        AND a.flag IN ('SAVE', 'SUBMIT')
+        AND a.is_recheck = 'NO'
         <if test="ex.orderBy == null or ex.orderBy ==''">
             ORDER BY a.create_time DESC
         </if>
@@ -460,4 +462,25 @@
         </if>
         ${ex.orderBy}
     </select>
+
+    <select id="websitPurchaseOrderPage"
+            resultType="com.gree.mall.manager.bean.material.manage.WebsitPurchaseOrderVO">
+        SELECT
+            ${ex.selected}
+        FROM
+            websit_purchase 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>
+        AND a.flag IN ('SUBMIT', 'OK', 'CANCEL')
+        AND a.is_recheck = 'YES'
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
 </mapper>

BIN
mall-server-api/src/main/resources/template/辅材模板.xlsx