Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/develop' into develop

‘linchangsheng’ 8 mesiacov pred
rodič
commit
92f84bbf68
24 zmenil súbory, kde vykonal 1424 pridanie a 152 odobranie
  1. 5 5
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/base/WebsitGoodsPVO.java
  2. 0 9
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/base/WebsitNormChargeVO.java
  3. 95 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitMPurchaseBean.java
  4. 85 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitMPurchaseItemBean.java
  5. 63 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPurchaseApplyVO.java
  6. 19 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/vender/WebsitVenderGoodsBean.java
  7. 96 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/vender/WebsitVenderGoodsRelaVO.java
  8. 57 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/vender/WebsitVenderGoodsVO.java
  9. 26 0
      mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/MaterialMapper.java
  10. 4 0
      mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java
  11. 139 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPurchaseApplyController.java
  12. 123 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/material/vender/VenderGoodsController.java
  13. 24 2
      mall-server-api/src/main/java/com/gree/mall/manager/logic/common/CommonLogic.java
  14. 55 52
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/base/NormChargeLogic.java
  15. 104 84
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/base/WebsitGoodsLogic.java
  16. 304 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitMPurchaseLogic.java
  17. 10 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitSalesLogic.java
  18. 176 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/vender/VenderGoodsLogic.java
  19. 39 0
      mall-server-api/src/main/resources/mapper/MaterialMapper.xml
  20. BIN
      mall-server-api/src/main/resources/template/辅材收费标准模板(服务收费).xlsx
  21. BIN
      mall-server-api/src/main/resources/template/辅材收费标准模板(物料收费).xlsx
  22. BIN
      mall-server-api/src/main/resources/template/辅材模板.xlsx
  23. BIN
      mall-server-api/src/main/resources/template/配件模板(服务收费).xlsx
  24. BIN
      mall-server-api/src/main/resources/template/配件模板(配件物料).xlsx

+ 5 - 5
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/base/WebsitGoodsPVO.java

@@ -63,11 +63,11 @@ public class WebsitGoodsPVO {
     @ApiModelProperty(value = "收费标准")
     private BigDecimal normAmount;
 
-    @ApiModelProperty(value = "自有库存师傅分账金额(师傅分账比例)")
-    private BigDecimal selfWorkerAmount;
-
-    @ApiModelProperty(value = "自有库存商户分账金额(商户分账比例)")
-    private BigDecimal selfWebsitAmount;
+//    @ApiModelProperty(value = "自有库存师傅分账金额(师傅分账比例)")
+//    private BigDecimal selfWorkerAmount;
+//
+//    @ApiModelProperty(value = "自有库存商户分账金额(商户分账比例)")
+//    private BigDecimal selfWebsitAmount;
 
     @ApiModelProperty(value = "创建人")
     private String createBy;

+ 0 - 9
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/base/WebsitNormChargeVO.java

@@ -56,15 +56,6 @@ public class WebsitNormChargeVO {
     @ApiModelProperty(value = "收费标准")
     private BigDecimal normAmount;
 
-    @ApiModelProperty(value = "自有库存师傅分账金额")
-    private BigDecimal selfWorkerAmount;
-
-    @ApiModelProperty(value = "自有库存商户分账金额")
-    private BigDecimal selfWebsitAmount;
-
-    @ApiModelProperty(value = "师傅手工费用")
-    private BigDecimal manualAmount;
-
     @ApiModelProperty(value = "状态")
     private StateEnum status;
 

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

@@ -0,0 +1,95 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ApiModel
+public class WebsitMPurchaseBean {
+
+    @ApiModelProperty(value = "单号")
+    private String purchaseId;
+
+    @ApiModelProperty(value = "商户编号")
+    private String companyWechatId;
+
+    @ApiModelProperty(value = "商户名称")
+    private String companyWechatName;
+
+    @ApiModelProperty(value = "网点编号")
+    private String websitId;
+
+    @ApiModelProperty(value = "网点名称")
+    private String websitName;
+
+    @ApiModelProperty(value = "商品类型")
+    private String goodsType;
+
+    @ApiModelProperty(value = "供应商编号")
+    private String venderId;
+
+    @ApiModelProperty(value = "供应商名称")
+    private String venderName;
+
+    @ApiModelProperty(value = "仓储id")
+    private String storageId;
+
+    @ApiModelProperty(value = "仓储名称")
+    private String storageName;
+
+    @ApiModelProperty(value = "采购日期")
+    private Date purchaseTime;
+
+    @ApiModelProperty(value = "附件地址")
+    private String imageUrl;
+
+    @ApiModelProperty(value = "采购总金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "单据状态 SAVE=保存 OK=通过 FAIL=失败")
+    private String 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 confirmBy;
+
+    @ApiModelProperty(value = "审核时间")
+    private Date confirmTime;
+
+    @ApiModelProperty(value = "提交人")
+    private String submitBy;
+
+    @ApiModelProperty(value = "提交时间")
+    private Date submitTime;
+
+    @ApiModelProperty(value = "核实人")
+    private String checkBy;
+
+    @ApiModelProperty(value = "核实时间")
+    private Date checkTime;
+
+    @ApiModelProperty(value = "是否导入数据 true=是 false=否")
+    private Boolean isImport;
+
+    @ApiModelProperty(value = "明细")
+    List<WebsitMPurchaseItemBean> items;
+}

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

@@ -0,0 +1,85 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel
+public class WebsitMPurchaseItemBean {
+
+    @ApiModelProperty(value = "商户编号")
+    private String companyWechatId;
+
+    @ApiModelProperty(value = "网点编号")
+    private String websitId;
+
+    @ApiModelProperty(value = "网点名称")
+    private String websitName;
+
+    @ApiModelProperty(value = "单号")
+    private String purchaseId;
+
+    @ApiModelProperty(value = "商品类型 M=辅材 P=配件")
+    private String goodsType;
+
+    @ApiModelProperty(value = "商品编号")
+    private String goodsId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "预估进价")
+    private BigDecimal applyCost;
+
+    @ApiModelProperty(value = "预估进价金额")
+    private BigDecimal applyCostValue;
+
+    @ApiModelProperty(value = "申请数量")
+    private BigDecimal applyQty;
+
+    @ApiModelProperty(value = "核实数量")
+    private BigDecimal checkQty;
+
+    @ApiModelProperty(value = "进价")
+    private BigDecimal cost;
+
+    @ApiModelProperty(value = "验收金额")
+    private BigDecimal costValue;
+
+    @ApiModelProperty(value = "验收数量")
+    private BigDecimal recQty;
+
+    @ApiModelProperty(value = "验收赠品数量")
+    private BigDecimal recGiftQty;
+
+    @ApiModelProperty(value = "商品代码")
+    private String goodsCode;
+
+    @ApiModelProperty(value = "库存单位")
+    private String goodsStockUnit;
+
+    @ApiModelProperty(value = "规格型号")
+    private String goodsSpecification;
+
+    @ApiModelProperty(value = "商品父类编号")
+    private String parentCategoryId;
+
+    @ApiModelProperty(value = "商品父类名称")
+    private String parentCategoryName;
+
+    @ApiModelProperty(value = "商品小类编号")
+    private String goodsCategoryId;
+
+    @ApiModelProperty(value = "商品小类名称")
+    private String goodsCategoryName;
+
+    @ApiModelProperty(value = "退货数量")
+    private BigDecimal retQty;
+
+    @ApiModelProperty(value = "备注")
+    private String note;
+
+}

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

@@ -0,0 +1,63 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.annotation.ZfireField;
+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;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class WebsitPurchaseApplyVO {
+
+    @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;
+
+    @ZfireField(hide = true)
+    @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;
+
+}

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

@@ -0,0 +1,19 @@
+package com.gree.mall.manager.bean.material.vender;
+
+import com.gree.mall.manager.plus.entity.WebsitVenderGoods;
+import com.gree.mall.manager.plus.entity.WebsitVenderGoodsItem;
+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 WebsitVenderGoodsBean extends WebsitVenderGoods {
+
+    @ApiModelProperty(value = "商品明细")
+    private List<WebsitVenderGoodsItem> items;
+}

+ 96 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/vender/WebsitVenderGoodsRelaVO.java

@@ -0,0 +1,96 @@
+package com.gree.mall.manager.bean.material.vender;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.material.JudgeEnum;
+import com.gree.mall.manager.enums.material.StateEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@ApiModel
+@Data
+@ZfireField(tbName = "a")
+public class WebsitVenderGoodsRelaVO {
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "商户编号")
+    private String companyWechatId;
+
+    @ApiModelProperty(value = "商户名称")
+    private String companyWechatName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "供应商编号")
+    private String venderId;
+
+    @ApiModelProperty(value = "供应商名称")
+    private String venderName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "商品编号")
+    private String goodsId;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ZfireField(tbName = "b", hide = true)
+    @ApiModelProperty(value = "商品代码")
+    private String goodsCode;
+
+    @ApiModelProperty(value = "进价")
+    private BigDecimal cost;
+
+    @ApiModelProperty(value = "状态")
+    private StateEnum relaStatus;
+
+    @ZfireField(tbName = "c", hide = true, colName = "parent_category_id")
+    @ApiModelProperty(value = "商品父类编号")
+    private String parentCategoryId;
+
+    @ZfireField(tbName = "c", colName = "parent_category_name")
+    @ApiModelProperty(value = "父类名称")
+    private String parentCategoryName;
+
+    @ZfireField(tbName = "b", hide = true)
+    @ApiModelProperty(value = "商品小类编号")
+    private String goodsCategoryId;
+
+    @ZfireField(tbName = "b", colName = "category_name")
+    @ApiModelProperty(value = "分类名称")
+    private String categoryName;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "规格型号")
+    private String goodsSpecification;
+
+    @ZfireField(tbName = "b")
+    @ApiModelProperty(value = "库存单位")
+    private String goodsStockUnit;
+
+    @ZfireField(tbName = "b", hide = true)
+    @ApiModelProperty(value = "销售单位")
+    private String goodsSalesUnit;
+
+    @ZfireField(tbName = "b", hide = true)
+    @ApiModelProperty(value = "销售单位转换系数")
+    private BigDecimal goodsSalesConvertQty;
+
+    @ZfireField(tbName = "b", hide = true)
+    @ApiModelProperty(value = "辅材状态")
+    private StateEnum status;
+
+    @ZfireField(tbName = "b", hide = true)
+    @ApiModelProperty(value = "是否入师傅库存")
+    private JudgeEnum manageWorkerStock;
+
+    @ZfireField(tbName = "b", hide = true)
+    @ApiModelProperty(value = "进价范围最小")
+    private BigDecimal costRangeMini;
+
+    @ZfireField(tbName = "b", hide = true)
+    @ApiModelProperty(value = "进价范围最大")
+    private BigDecimal costRangeMax;
+}

+ 57 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/vender/WebsitVenderGoodsVO.java

@@ -0,0 +1,57 @@
+package com.gree.mall.manager.bean.material.vender;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.ExamineStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@ApiModel
+@Data
+@ZfireField(tbName = "a")
+public class WebsitVenderGoodsVO {
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "单号")
+    private String sheetId;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "商户编号")
+    private String companyWechatId;
+
+    @ApiModelProperty(value = "商户名称")
+    private String companyWechatName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "供应商编号")
+    private String venderId;
+
+    @ApiModelProperty(value = "供应商名称")
+    private String venderName;
+
+    @ApiModelProperty(value = "状态")
+    private ExamineStatusEnum status;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "审核人")
+    private String confirmBy;
+
+    @ApiModelProperty(value = "审核时间")
+    private Date confirmTime;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+}

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

@@ -8,6 +8,8 @@ import com.gree.mall.manager.bean.material.base.*;
 import com.gree.mall.manager.bean.material.manage.*;
 import com.gree.mall.manager.bean.material.stock.WebsitSalesCategoryVO;
 import com.gree.mall.manager.bean.material.stock.WebsitSalesGoodsVO;
+import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsRelaVO;
+import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsVO;
 import com.gree.mall.manager.bean.material.vender.WebsitVenderVO;
 import com.gree.mall.manager.zfire.bean.WebsitGoodsParamBean;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
@@ -199,4 +201,28 @@ public interface MaterialMapper {
     List<EnginPayManageGatherVO> enginPayManageGatherLastUpdate(@Param("companyWechatId") String companyWechatId, @Param("projectList") List<String> projectList);
 
     List<WorkerGoodsRelaExportBean> exportWorkerMaterialRela(@Param("companyWechatId") String companyWechatId);
+
+    /**
+     * 供应商供应商品列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WebsitVenderGoodsVO> websitVenderGoodsPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 供应商商品关系列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WebsitVenderGoodsRelaVO> websitVenderGoodsRalaPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 网点申请单列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WebsitPurchaseApplyVO> websitPurchaseApplyPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
 }

+ 4 - 0
mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java

@@ -18,6 +18,9 @@ public class Constant {
 
     public final static Integer PAGE_SIZE = 100000;
 
+    // 辅材编号前缀
+    public final static String FC = "FC";
+
     public class Ali {
         public final static String ACCESS_KEY_ID = "LTAI4GK1q4mnpCFbonMd1pji";
         public final static String ACCESS_KEY_SECERT = "E5LW0V1H8HBxqjKkExIxaXUgSyex6C";
@@ -78,6 +81,7 @@ public class Constant {
         public final static String BALANCE_SEL_MOBILE_SMS = "jsm:SETTLE:BALANCE:SMS";
         public final static String ISSUE_SAL_MOBILE_SMS = "jsm:SETTLE:ISSUE:SMS";
         public final static String LOCK_SUMMARY_ISSUE = "jsm:SETTLE:lock:issue:summary";
+        public static final String LOCK_MATERIAL_PURCHASE = "jsm:sxb:material:purchase:";
     }
     public class ChatMessage {
         public final static String MSG_TYPE_DOC = "docmsg";

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

@@ -0,0 +1,139 @@
+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.WebsitPurchaseApplyVO;
+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.WebsitMPurchaseLogic;
+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.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+@Slf4j
+@RestController
+@Api(value = "网点采购申请API", tags ={"网点采购申请API"} )
+@Validated
+@RequestMapping(value = "/websit/purchase/apply", produces = "application/json; charset=utf-8")
+public class WebsitPurchaseApplyController {
+
+    @Resource
+    WebsitMPurchaseLogic websitMPurchaseLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+    @ZfireList
+    @PostMapping("/list")
+    @ApiOperation(value = "网点采购申请-列表")
+    public ResponseHelper<IPage<WebsitPurchaseApplyVO>> page(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<WebsitPurchaseApplyVO> page = websitMPurchaseLogic.page(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<WebsitPurchaseApplyVO>() {});
+    }
+
+    @PostMapping("/list/export")
+    @ApiOperation("网点采购申请-导出")
+    public void listExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<WebsitPurchaseApplyVO> baseVOIPage = websitMPurchaseLogic.page(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(baseVOIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/detail")
+    @ApiOperation(value = "网点采购申请-详情")
+    public ResponseHelper<WebsitMPurchaseBean> detail(
+            @ApiParam(value = "purchaseId", required = true) @RequestParam String purchaseId
+    ) throws RemoteServiceException {
+        WebsitMPurchaseBean bean = websitMPurchaseLogic.detail(purchaseId);
+        return ResponseHelper.success(bean);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation(value = "网点采购申请-添加")
+    public ResponseHelper add(
+            @RequestBody WebsitMPurchaseBean bean
+    ) throws Exception {
+        websitMPurchaseLogic.add(bean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/edit")
+    @ApiOperation(value = "网点采购申请-编辑")
+    public ResponseHelper edit(
+            @RequestBody WebsitMPurchaseBean bean
+    ) throws Exception {
+        websitMPurchaseLogic.edit(bean);
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/batch/del")
+    @ApiOperation(value = "网点采购申请-批量删除")
+    public ResponseHelper batchDel(@RequestBody List<String> purchaseIds)
+            throws RemoteServiceException {
+        websitMPurchaseLogic.batchDel(purchaseIds);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/revoke")
+    @ApiOperation(value = "网点采购申请-撤消")
+    public ResponseHelper revoke(@ApiParam(value = "采购申请单id",required = true) @RequestParam String purchaseId)
+            throws RemoteServiceException {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseId);
+        try {
+            if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+                log.error("获取采购申请单锁超时!");
+            }
+            websitMPurchaseLogic.revoke(purchaseId);
+        } catch (InterruptedException e) {
+            log.error(purchaseId + " 撤消失败!", e);
+            throw new RemoteServiceException(purchaseId + " 撤消失败!" + e.getMessage());
+        } finally {
+            obtain.unlock();
+        }
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/submit")
+    @ApiOperation(value = "网点采购申请-提交")
+    public ResponseHelper submit(@ApiParam(value = "采购申请单id",required = true) @RequestParam String purchaseId)
+            throws RemoteServiceException {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_MATERIAL_PURCHASE + purchaseId);
+        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();
+        }
+
+        return ResponseHelper.success();
+    }
+
+}

+ 123 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/vender/VenderGoodsController.java

@@ -0,0 +1,123 @@
+package com.gree.mall.manager.controller.material.vender;
+
+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.vender.WebsitVenderGoodsBean;
+import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsRelaVO;
+import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsVO;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.material.vender.VenderGoodsLogic;
+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.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Slf4j
+@RestController
+@Api(value = "供应商商品管理API", tags ={"供应商商品管理API"} )
+@RequestMapping(value = "/vender/goods", produces = "application/json; charset=utf-8")
+public class VenderGoodsController {
+
+    @Resource
+    VenderGoodsLogic venderGoodsLogic;
+
+    @ZfireList
+    @PostMapping("/list")
+    @ApiOperation(value = "供应商供应商品-列表")
+    public ResponseHelper<IPage<WebsitVenderGoodsVO>> page(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<WebsitVenderGoodsVO> page = venderGoodsLogic.page(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<WebsitVenderGoodsVO>() {});
+    }
+
+    @PostMapping("/list/export")
+    @ApiOperation("供应商供应商品-导出")
+    public void listExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<WebsitVenderGoodsVO> baseVOIPage = venderGoodsLogic.page(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(baseVOIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/detail")
+    @ApiOperation(value = "供应商供应商品-详情")
+    public ResponseHelper<WebsitVenderGoodsBean> detail(
+            @ApiParam(value = "id", required = true) @RequestParam String id
+    ) throws RemoteServiceException {
+        return ResponseHelper.success(venderGoodsLogic.detail(id));
+    }
+
+    @PostMapping("/add")
+    @ApiOperation(value = "供应商供应商品-添加")
+    public ResponseHelper add(
+            @RequestBody WebsitVenderGoodsBean bean
+    ) throws Exception {
+        venderGoodsLogic.add(bean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/edit")
+    @ApiOperation(value = "供应商供应商品-编辑")
+    public ResponseHelper edit(
+            @RequestBody WebsitVenderGoodsBean bean
+    ) throws Exception {
+        venderGoodsLogic.edit(bean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/confirm")
+    @ApiOperation(value = "供应商供应商品-审核")
+    public ResponseHelper confirm(
+            @RequestBody WebsitVenderGoodsBean bean
+    ) throws Exception {
+        venderGoodsLogic.confirm(bean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/del")
+    @ApiOperation(value = "供应商供应商品-批量删除")
+    public ResponseHelper del(
+            @RequestBody List<String> ids
+    ) throws Exception {
+        venderGoodsLogic.del(ids);
+        return ResponseHelper.success();
+    }
+
+    @ZfireList
+    @PostMapping("/rela/list")
+    @ApiOperation(value = "供应商商品关系-列表")
+    public ResponseHelper<IPage<WebsitVenderGoodsRelaVO>> ralaPage(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<WebsitVenderGoodsRelaVO> page = venderGoodsLogic.ralaPage(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<WebsitVenderGoodsRelaVO>() {});
+    }
+
+    @PostMapping("/rela/list/export")
+    @ApiOperation("供应商商品关系-导出")
+    public void ralaListExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<WebsitVenderGoodsRelaVO> baseVOIPage = venderGoodsLogic.ralaPage(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(baseVOIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+}

+ 24 - 2
mall-server-api/src/main/java/com/gree/mall/manager/logic/common/CommonLogic.java

@@ -422,7 +422,7 @@ public class CommonLogic {
      * @param length 一般13 位
      * @return
      */
-    public  String generateNo(String start, String orderType, int length) {
+    public String generateNo(String start, String orderType, int length) {
         String dayFmt = DateUtil.format(new Date(), "yyMMdd");
         String tNumKey = Constant.RedisPrefix.ORDER_NUM + orderType + dayFmt;
         StringBuffer number = new StringBuffer();
@@ -436,7 +436,7 @@ public class CommonLogic {
         return number.toString();
     }
 
-    public String generateReqNo(String start, String orderType,int length) {
+    public String generateReqNo(String start, String orderType, int length) {
         String dayFmt = DateUtil.format(new Date(), "yyyyMMdd");
         String tNumKey = Constant.RedisPrefix.ORDER_NUM + orderType + dayFmt;
         StringBuffer number = new StringBuffer();
@@ -450,6 +450,28 @@ public class CommonLogic {
         return number.toString();
     }
 
+    /**
+     * 生成辅材编号
+     * @param companyId 商户编号
+     * @param start 前缀
+     * @param orderType 订单类型
+     * @param length 一般13 位
+     * @return
+     */
+    public String generateMaterialNo(String companyId, String start, String orderType, int length) {
+        String dayFmt = DateUtil.format(new Date(), "yyyy");
+        String tNumKey = Constant.RedisPrefix.ORDER_NUM + dayFmt + orderType + companyId;
+        StringBuilder number = new StringBuilder();
+        number.append(start);
+        number.append(dayFmt);
+        int ramainLen = length - number.toString().length();
+        //自增 填充位数
+        Object value = redisUtil.incr(tNumKey, 1);
+        redisUtil.expire(tNumKey, 24 * 60 * 60);
+        number.append(String.format("%0" + ramainLen + "d", Integer.parseInt(value.toString())));
+        return number.toString();
+    }
+
 
     /**
      * 获取跳往小程序的链接(带公众号openid)

+ 55 - 52
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/base/NormChargeLogic.java

@@ -125,18 +125,18 @@ public class NormChargeLogic {
             throw new RemoteServiceException("收费标准不能为空");
         }
 
-        if (Objects.isNull(bean.getSelfWorkerAmount())) {
-            if (bean.getNormType().equals(NormTypeEnum.M.getKey())) {
-                throw new RemoteServiceException("自有库存师傅分账金额不能为空");
-            } else {
-                throw new RemoteServiceException("师傅分账金额不能为空");
-            }
-        }
-
-        if (Objects.isNull(bean.getManualAmount())) {
-            throw new RemoteServiceException("师傅手工费用不能为空");
-        }
-
+//        if (Objects.isNull(bean.getSelfWorkerAmount())) {
+//            if (bean.getNormType().equals(NormTypeEnum.M.getKey())) {
+//                throw new RemoteServiceException("自有库存师傅分账金额不能为空");
+//            } else {
+//                throw new RemoteServiceException("师傅分账金额不能为空");
+//            }
+//        }
+//
+//        if (Objects.isNull(bean.getManualAmount())) {
+//            throw new RemoteServiceException("师傅手工费用不能为空");
+//        }
+//
 //        if (bean.getNormType().equals(NormTypeEnum.M.getKey()) && Objects.isNull(bean.getOutWorkerAmount())) {
 //            throw new RemoteServiceException("外购辅材师傅分账金额不能为空");
 //        }
@@ -147,20 +147,21 @@ public class NormChargeLogic {
 //            BigDecimal outWorkerAmount = BigDecimal.ZERO;
 //            BigDecimal outWebsitAmount = BigDecimal.ZERO;
 
-            if (bean.getSelfWorkerAmount().compareTo(BigDecimal.ZERO) > 0) {
-                if (bean.getSelfWorkerAmount().compareTo(bean.getNormAmount()) > 0) {
-                    if (bean.getNormType().equals(NormTypeEnum.M.getKey())) {
-                        throw new RemoteServiceException("自有库存师傅分账金额不能大于收费标准");
-                    } else {
-                        throw new RemoteServiceException("师傅分账金额不能大于收费标准");
-                    }
-                }
+//            if (bean.getSelfWorkerAmount().compareTo(BigDecimal.ZERO) > 0) {
+//                if (bean.getSelfWorkerAmount().compareTo(bean.getNormAmount()) > 0) {
+//                    if (bean.getNormType().equals(NormTypeEnum.M.getKey())) {
+//                        throw new RemoteServiceException("自有库存师傅分账金额不能大于收费标准");
+//                    } else {
+//                        throw new RemoteServiceException("师傅分账金额不能大于收费标准");
+//                    }
+//                }
 
-                selWorkerAmount = bean.getSelfWorkerAmount();
+//                selWorkerAmount = bean.getSelfWorkerAmount();
+                selWorkerAmount = bean.getNormAmount();
                 selWebsitAmount = bean.getNormAmount().subtract(selWorkerAmount);
-            } else {
-                selWebsitAmount = bean.getNormAmount();
-            }
+//            } else {
+//                selWebsitAmount = bean.getNormAmount();
+//            }
 
 //            if (bean.getOutWorkerAmount().compareTo(BigDecimal.ZERO) > 0) {
 //                if (bean.getOutWorkerAmount().compareTo(bean.getNormAmount()) > 0) {
@@ -245,16 +246,16 @@ public class NormChargeLogic {
 
         for (int i = 0; i < objects.size(); i++) {
             List<Object> row = (List<Object>) objects.get(i);
-            if (row.size() < 8) {
+            if (row.size() < 6) {
                 row.add(null);
                 row.add(null);
                 row.add(null);
             }
-            if (row.size() < 9) {
+            if (row.size() < 7) {
                 row.add(null);
                 row.add(null);
             }
-            if (row.size() < 10) {
+            if (row.size() < 8) {
                 row.add(null);
             }
             if (Objects.isNull(row.get(0))) {
@@ -287,12 +288,12 @@ public class NormChargeLogic {
             String goodsNameStr = (String) row.get(2);
             String unitStr = (String) row.get(3);
             String salesStr = (String) row.get(4);
-            String amount1Str = (String) row.get(5);
+//            String amount1Str = (String) row.get(5);
 //            String amount2Str = (String) row.get(6);
-            String manualAmountStr = (String) row.get(6);
-            String goodsCodeStr = (String) row.get(7);
-            String specificationStr = (String) row.get(8);
-            String remark = (String) row.get(9);
+//            String manualAmountStr = (String) row.get(6);
+            String goodsCodeStr = (String) row.get(5);
+            String specificationStr = (String) row.get(6);
+            String remark = (String) row.get(7);
 
             if (!treeMap.containsKey(parentCategoryStr)) {
                 throw new RemoteServiceException("第" + (i+1) + "行, 大类信息不存在");
@@ -334,11 +335,12 @@ public class NormChargeLogic {
             goods.setSpecification(specificationStr);
             goods.setRemark(remark);
             goods.setNormAmount(new BigDecimal(salesStr));
-            goods.setSelfWorkerAmount(new BigDecimal(amount1Str));
-            goods.setSelfWebsitAmount(goods.getNormAmount().subtract(new BigDecimal(amount1Str)));
+            goods.setSelfWorkerAmount(goods.getNormAmount());
+//            goods.setSelfWorkerAmount(new BigDecimal(amount1Str));
+//            goods.setSelfWebsitAmount(goods.getNormAmount().subtract(new BigDecimal(amount1Str)));
 //            goods.setOutWorkerAmount(new BigDecimal(amount2Str));
 //            goods.setOutWebsitAmount(goods.getNormAmount().subtract(new BigDecimal(amount2Str)));
-            goods.setManualAmount(new BigDecimal(manualAmountStr));
+//            goods.setManualAmount(new BigDecimal(manualAmountStr));
             goods.setUnit(unitStr);
             goods.setNormType(NormTypeEnum.M.getKey());
 
@@ -384,16 +386,16 @@ public class NormChargeLogic {
 
         for (int i = 0; i < objects.size(); i++) {
             List<Object> row = (List<Object>) objects.get(i);
-            if (row.size() < 8) {
+            if (row.size() < 6) {
                 row.add(null);
                 row.add(null);
                 row.add(null);
             }
-            if (row.size() < 9) {
+            if (row.size() < 7) {
                 row.add(null);
                 row.add(null);
             }
-            if (row.size() < 10) {
+            if (row.size() < 8) {
                 row.add(null);
             }
             if (Objects.isNull(row.get(0))) {
@@ -411,23 +413,23 @@ public class NormChargeLogic {
             if (Objects.isNull(row.get(4))) {
                 throw new RemoteServiceException("第" + (i+1) + "行, 收费标准不能为空");
             }
-            if (Objects.isNull(row.get(5))) {
-                throw new RemoteServiceException("第" + (i+1) + "行, 师傅分账金额不能为空");
-            }
-            if (Objects.isNull(row.get(6))) {
-                throw new RemoteServiceException("第" + (i+1) + "行, 师傅手工费用不能为空");
-            }
+//            if (Objects.isNull(row.get(5))) {
+//                throw new RemoteServiceException("第" + (i+1) + "行, 师傅分账金额不能为空");
+//            }
+//            if (Objects.isNull(row.get(6))) {
+//                throw new RemoteServiceException("第" + (i+1) + "行, 师傅手工费用不能为空");
+//            }
 
             String parentCategoryStr = (String) row.get(0);
             String categoryStr = (String) row.get(1);
             String goodsNameStr = (String) row.get(2);
             String unitStr = (String) row.get(3);
             String salesStr = (String) row.get(4);
-            String amount1Str = (String) row.get(5);
-            String manualAmountStr = (String) row.get(6);
-            String goodsCodeStr = (String) row.get(7);
-            String specificationStr = (String) row.get(8);
-            String remark = (String) row.get(9);
+//            String amount1Str = (String) row.get(5);
+//            String manualAmountStr = (String) row.get(6);
+            String goodsCodeStr = (String) row.get(5);
+            String specificationStr = (String) row.get(6);
+            String remark = (String) row.get(7);
 
             if (!treeMap.containsKey(parentCategoryStr)) {
                 throw new RemoteServiceException("第" + (i+1) + "行, 大类信息不存在");
@@ -469,9 +471,10 @@ public class NormChargeLogic {
             goods.setSpecification(specificationStr);
             goods.setRemark(remark);
             goods.setNormAmount(new BigDecimal(salesStr));
-            goods.setSelfWorkerAmount(new BigDecimal(amount1Str));
-            goods.setSelfWebsitAmount(goods.getNormAmount().subtract(new BigDecimal(amount1Str)));
-            goods.setManualAmount(new BigDecimal(manualAmountStr));
+            goods.setSelfWorkerAmount(goods.getNormAmount());
+//            goods.setSelfWorkerAmount(new BigDecimal(amount1Str));
+//            goods.setSelfWebsitAmount(goods.getNormAmount().subtract(new BigDecimal(amount1Str)));
+//            goods.setManualAmount(new BigDecimal(manualAmountStr));
             goods.setUnit(unitStr);
             goods.setNormType(NormTypeEnum.S.getKey());
 

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

@@ -2,6 +2,7 @@ package com.gree.mall.manager.logic.material.base;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.gree.mall.manager.bean.admin.AdminUserCom;
@@ -11,6 +12,7 @@ import com.gree.mall.manager.bean.material.base.WebsitGoodsBean;
 import com.gree.mall.manager.bean.material.base.WebsitGoodsMVO;
 import com.gree.mall.manager.bean.material.base.WebsitGoodsPVO;
 import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.enums.material.JudgeEnum;
 import com.gree.mall.manager.enums.material.NormTypeEnum;
 import com.gree.mall.manager.enums.material.StateEnum;
@@ -142,9 +144,7 @@ public class WebsitGoodsLogic {
 
         WebsitGoods goods = new WebsitGoods();
         BeanUtils.copyProperties(bean, goods);
-        // 库存单位与销售单位一致
-        goods.setGoodsSalesUnit(goods.getGoodsStockUnit());
-//        goods.setManageWorkerStock(JudgeEnum.YES.getKey());
+
         if (StringUtils.isBlank(goods.getNormType())) {
             goods.setNormType(NormTypeEnum.M.getKey());
         }
@@ -162,7 +162,9 @@ public class WebsitGoodsLogic {
         // 检查辅材名称、配件代码唯一
         this.checkMaterialUnique(goods);
 
-
+        if (goods.getGoodsType().equals(WebsitGoodsTypeEnum.M.getKey())) {
+            goods.setGoodsId(commonLogic.generateMaterialNo(goods.getCompanyWechatId(), Constant.FC, Constant.FC, 11));
+        }
         goods.insert();
     }
 
@@ -187,21 +189,28 @@ public class WebsitGoodsLogic {
     }
 
     private void stockUnitEmptyAdd(WebsitGoods goods) {
-        if (StringUtils.isNotBlank(goods.getGoodsStockUnit())) {
+        if (goods.getGoodsType().equals(WebsitGoodsTypeEnum.M.getKey())) {
+            if (StringUtils.isBlank(goods.getGoodsStockUnit())) {
+                throw new RemoteServiceException("库存单位不能为空");
+            }
+            if (StringUtils.isBlank(goods.getGoodsSalesUnit())) {
+                throw new RemoteServiceException("销售单位不能为空");
+            }
+        }
 
-            String type = goods.getGoodsType().equals(WebsitGoodsTypeEnum.M.getKey()) ? "ASSIST_UNIT" : "PARTS_UNIT";
-            Integer count = sysDictCompanyService.lambdaQuery()
-                    .eq(SysDictCompany::getDictType, type)
-                    .eq(SysDictCompany::getDictValue, goods.getGoodsStockUnit())
-                    .count();
+        String type = goods.getGoodsType().equals(WebsitGoodsTypeEnum.M.getKey()) ? "ASSIST_UNIT" : "PARTS_UNIT";
+        Integer count = sysDictCompanyService.lambdaQuery()
+                .eq(SysDictCompany::getDictType, type)
+                .eq(SysDictCompany::getDictValue, goods.getGoodsStockUnit())
+                .count();
 
-            if (count == 0) {
-                SysDictCompany company = new SysDictCompany();
-                company.setDictType(type)
-                        .setDictValue(goods.getGoodsStockUnit());
-                sysDictCompanyLogic.saveOpenDict(company);
-            }
+        if (count == 0) {
+            SysDictCompany company = new SysDictCompany();
+            company.setDictType(type)
+                    .setDictValue(goods.getGoodsStockUnit());
+            sysDictCompanyLogic.saveOpenDict(company);
         }
+
     }
 
     private void handlePartsInfo(HttpServletRequest request, WebsitGoods goods, WebsitGoodsBean bean) {
@@ -273,44 +282,44 @@ public class WebsitGoodsLogic {
             if (goods.getNormType().equals(NormTypeEnum.M.getKey()) && Objects.isNull(goods.getNormAmount())) {
                 throw new RemoteServiceException("收费标准不能为空");
             }
-
-            if (Objects.isNull(goods.getSelfWorkerAmount())) {
-                if (goods.getNormType().equals(NormTypeEnum.M.getKey())) {
-                    throw new RemoteServiceException("自有库存师傅分账金额不能为空");
-                } else {
-                    throw new RemoteServiceException("师傅分账比例不能为空");
-                }
-            }
+//
+//            if (Objects.isNull(goods.getSelfWorkerAmount())) {
+//                if (goods.getNormType().equals(NormTypeEnum.M.getKey())) {
+//                    throw new RemoteServiceException("自有库存师傅分账金额不能为空");
+//                } else {
+//                    throw new RemoteServiceException("师傅分账比例不能为空");
+//                }
+//            }
 
 //            if (goods.getNormType().equals(NormTypeEnum.M.getKey()) && Objects.isNull(goods.getOutWorkerAmount())) {
 //                throw new RemoteServiceException("外购配件师傅分账金额不能为空");
 //            }
 
             // 检查收费标准和分账金额
-            BigDecimal selWorkerAmount = BigDecimal.ZERO;
+            BigDecimal selWorkerAmount = goods.getNormAmount();
             BigDecimal selWebsitAmount = BigDecimal.ZERO;
 //            BigDecimal outWorkerAmount = BigDecimal.ZERO;
 //            BigDecimal outWebsitAmount = BigDecimal.ZERO;
-            if (goods.getNormType().equals(NormTypeEnum.M.getKey())) {
-                if (goods.getSelfWorkerAmount().compareTo(BigDecimal.ZERO) > 0) {
-
-                    if (goods.getSelfWorkerAmount().compareTo(goods.getNormAmount()) > 0) {
-                        throw new RemoteServiceException("自有库存师傅分账金额不能大于收费标准");
-                    }
-
-                    selWorkerAmount = goods.getSelfWorkerAmount();
-                    selWebsitAmount = goods.getNormAmount().subtract(selWorkerAmount);
-                } else {
-                    selWebsitAmount = goods.getNormAmount();
-                }
-
-            } else {
-                if (goods.getSelfWorkerAmount().add(goods.getSelfWebsitAmount()).compareTo(BigDecimal.valueOf(100)) > 0) {
-                    throw new RemoteServiceException("分账比例不能大于100%");
-                }
-                selWorkerAmount = goods.getSelfWorkerAmount();
-                selWebsitAmount = goods.getSelfWebsitAmount();
-            }
+//            if (goods.getNormType().equals(NormTypeEnum.M.getKey())) {
+//                if (goods.getSelfWorkerAmount().compareTo(BigDecimal.ZERO) > 0) {
+//
+//                    if (goods.getSelfWorkerAmount().compareTo(goods.getNormAmount()) > 0) {
+//                        throw new RemoteServiceException("自有库存师傅分账金额不能大于收费标准");
+//                    }
+//
+//                    selWorkerAmount = goods.getSelfWorkerAmount();
+//                    selWebsitAmount = goods.getNormAmount().subtract(selWorkerAmount);
+//                } else {
+//                    selWebsitAmount = goods.getNormAmount();
+//                }
+//
+//            } else {
+//                if (goods.getSelfWorkerAmount().add(goods.getSelfWebsitAmount()).compareTo(BigDecimal.valueOf(100)) > 0) {
+//                    throw new RemoteServiceException("分账比例不能大于100%");
+//                }
+//                selWorkerAmount = goods.getSelfWorkerAmount();
+//                selWebsitAmount = goods.getSelfWebsitAmount();
+//            }
 
 //            if (Objects.nonNull(goods.getOutWorkerAmount())
 //                    && goods.getOutWorkerAmount().compareTo(BigDecimal.ZERO) > 0) {
@@ -345,9 +354,6 @@ public class WebsitGoodsLogic {
         BeanUtils.copyProperties(bean, goods);
         goods.setCompanyWechatId(oldGoods.getCompanyWechatId())
                 .setCompanyWechatName(oldGoods.getCompanyWechatName());
-        // 库存单位与销售单位一致
-        goods.setGoodsSalesUnit(goods.getGoodsStockUnit());
-//        goods.setManageWorkerStock(JudgeEnum.YES.getKey());
 
         if (StringUtils.isNotBlank(goods.getGoodsCategoryId())) {
             WebsitGoodsCategory category = websitGoodsCategoryService.getById(goods.getGoodsCategoryId());
@@ -406,16 +412,16 @@ 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() < 7) {
+            if (row.size() < 8) {
                 row.add(null);
                 row.add(null);
                 row.add(null);
             }
-            if (row.size() < 8) {
+            if (row.size() < 9) {
                 row.add(null);
                 row.add(null);
             }
-            if (row.size() < 9) {
+            if (row.size() < 10) {
                 row.add(null);
             }
             if (Objects.isNull(row.get(0))) {
@@ -428,12 +434,18 @@ public class WebsitGoodsLogic {
                 throw new RemoteServiceException("第" + (i+1) + "行, 辅材名称不能为空");
             }
             if (Objects.isNull(row.get(3))) {
-                throw new RemoteServiceException("第" + (i+1) + "行, 单位不能为空");
+                throw new RemoteServiceException("第" + (i+1) + "行, 库存单位不能为空");
             }
             if (Objects.isNull(row.get(4))) {
-                throw new RemoteServiceException("第" + (i+1) + "行, 采购价格不能为空");
+                throw new RemoteServiceException("第" + (i+1) + "行, 销售单位不能为空");
             }
             if (Objects.isNull(row.get(5))) {
+                throw new RemoteServiceException("第" + (i+1) + "行, 销售单位不能为空");
+            }
+            if (Objects.isNull(row.get(6))) {
+                throw new RemoteServiceException("第" + (i+1) + "行, 采购价格不能为空");
+            }
+            if (Objects.isNull(row.get(7))) {
                 throw new RemoteServiceException("第" + (i+1) + "行, 销售价格不能为空");
             }
 
@@ -441,13 +453,14 @@ public class WebsitGoodsLogic {
             String categoryStr = (String) row.get(1);
             String goodsNameStr = (String) row.get(2);
             String unitStr = (String) row.get(3);
-            String costStr = (String) row.get(4);
-            String salesStr = (String) row.get(5);
-            String goodsCodeStr = (String) row.get(6);
-            String specificationStr = (String) row.get(7);
-            String remark = (String) row.get(8);
-            String manageWorkerStock = (String) row.get(9);
-            String salesConvertQty = (String) row.get(9);
+            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);
 
             if (!treeMap.containsKey(parentCategoryStr)) {
                 throw new RemoteServiceException("第" + (i+1) + "行, 大类信息不存在");
@@ -475,7 +488,11 @@ public class WebsitGoodsLogic {
             }
 
             if (!unitList.contains(unitStr)) {
-                throw new RemoteServiceException("第" + (i+1) + "行, 单位信息不存在");
+                throw new RemoteServiceException("第" + (i+1) + "行, 库存单位信息不存在");
+            }
+
+            if (!unitList.contains(saleUnitStr)) {
+                throw new RemoteServiceException("第" + (i+1) + "行, 销售单位信息不存在");
             }
 
             WebsitGoods goods = new WebsitGoods();
@@ -492,9 +509,8 @@ public class WebsitGoodsLogic {
             goods.setCost(new BigDecimal(costStr));
             goods.setMarketPrice(new BigDecimal(salesStr));
 
-            // 库存单位与销售单位一致
-            goods.setGoodsStockUnit(unitStr);
-            goods.setGoodsSalesUnit(unitStr);
+            goods.setGoodsStockUnit(StrUtil.trim(unitStr));
+            goods.setGoodsSalesUnit(StrUtil.trim(saleUnitStr));
             if (StringUtils.isBlank(manageWorkerStock) || manageWorkerStock.equals(JudgeEnum.YES.getRemark())) {
                 goods.setManageWorkerStock(JudgeEnum.YES.getKey());
             } else {
@@ -525,6 +541,10 @@ public class WebsitGoodsLogic {
                 this.checkMaterialUnique(goods);
             }
 
+            for (WebsitGoods goods : goodsList) {
+                goods.setGoodsId(commonLogic.generateMaterialNo(goods.getCompanyWechatId(), Constant.FC, Constant.FC, 11));
+            }
+
             websitGoodsService.saveBatch(goodsList);
         }
 
@@ -565,11 +585,11 @@ public class WebsitGoodsLogic {
         for (int i = 0; i < objects.size(); i++) {
             List<Object> row = (List<Object>) objects.get(i);
             CommonUtils.initList2(row, 11);
-            if (row.size() < 8) {
+            if (row.size() < 7) {
                 row.add(null);
                 row.add(null);
             }
-            if (row.size() < 9) {
+            if (row.size() < 8) {
                 row.add(null);
             }
             if (Objects.isNull(row.get(0))) {
@@ -590,9 +610,9 @@ public class WebsitGoodsLogic {
             if (Objects.isNull(row.get(5))) {
                 throw new RemoteServiceException("第" + (i+1) + "行, 适用产品大类不能为空");
             }
-            if (Objects.isNull(row.get(6))) {
-                throw new RemoteServiceException("第" + (i+1) + "行, 自有库存师傅分账金额不能为空");
-            }
+//            if (Objects.isNull(row.get(6))) {
+//                throw new RemoteServiceException("第" + (i+1) + "行, 自有库存师傅分账金额不能为空");
+//            }
 //            if (Objects.isNull(row.get(7))) {
 //                throw new RemoteServiceException("第" + (i+1) + "行, 外购库存师傅分账金额不能为空");
 //            }
@@ -603,10 +623,10 @@ public class WebsitGoodsLogic {
             String normAmountStr = (String) row.get(3);
             String brandStr = (String) row.get(4);
             String categoryStr = (String) row.get(5);
-            String selfAmountStr = (String) row.get(6);
-            String partType = (String) row.get(7);
-            String goodsCodeStr = (String) row.get(8);
-            String remark = (String) row.get(9);
+//            String selfAmountStr = (String) row.get(6);
+            String partType = (String) row.get(6);
+            String goodsCodeStr = (String) row.get(7);
+            String remark = (String) row.get(8);
 
 //            Integer count = websitGoodsService.lambdaQuery()
 //                    .eq(WebsitGoods::getCompanyWechatId, companyWechatId)
@@ -646,12 +666,12 @@ public class WebsitGoodsLogic {
             }
 
             BigDecimal normAmount = new BigDecimal(normAmountStr);
-            BigDecimal selfAmount = new BigDecimal(selfAmountStr);
+//            BigDecimal selfAmount = new BigDecimal(selfAmountStr);
 //            BigDecimal outAmount = new BigDecimal(outAmountStr);
-
-            if (selfAmount.compareTo(normAmount) > 0) {
-                throw new RemoteServiceException("第" + (i + 1) + "行, 自有库存师傅分账金额不能大于收费标准");
-            }
+//
+//            if (selfAmount.compareTo(normAmount) > 0) {
+//                throw new RemoteServiceException("第" + (i + 1) + "行, 自有库存师傅分账金额不能大于收费标准");
+//            }
 
             if (!"空调-冰箱-生活电器".contains(partType)) {
                 throw new RemoteServiceException("第" + (i + 1) + "行, 配件类型错误");
@@ -668,8 +688,8 @@ public class WebsitGoodsLogic {
             goods.setRemark(remark);
             goods.setMarketPrice(new BigDecimal(salesStr));
             goods.setNormAmount(normAmount);
-            goods.setSelfWorkerAmount(selfAmount);
-            goods.setSelfWebsitAmount(normAmount.subtract(selfAmount));
+            goods.setSelfWorkerAmount(normAmount);
+//            goods.setSelfWebsitAmount(normAmount.subtract(selfAmount));
 //            goods.setOutWorkerAmount(outAmount);
 //            goods.setOutWebsitAmount(normAmount.subtract(outAmount));
             goods.setBrandRelaName(brandStr);
@@ -677,8 +697,8 @@ public class WebsitGoodsLogic {
 
 
             // 库存单位与销售单位一致
-            goods.setGoodsStockUnit(unitStr);
-            goods.setGoodsSalesUnit(unitStr);
+            goods.setGoodsStockUnit(StrUtil.trim(unitStr));
+            goods.setGoodsSalesUnit(StrUtil.trim(unitStr));
             goods.setManageWorkerStock(JudgeEnum.YES.getKey());
             goods.setNormType(NormTypeEnum.M.getKey());
             goods.setPartType(partType);
@@ -775,8 +795,8 @@ public class WebsitGoodsLogic {
 
 
             // 库存单位与销售单位一致
-            goods.setGoodsStockUnit(unitStr);
-            goods.setGoodsSalesUnit(unitStr);
+            goods.setGoodsStockUnit(StrUtil.trim(unitStr));
+            goods.setGoodsSalesUnit(StrUtil.trim(unitStr));
             goods.setManageWorkerStock(JudgeEnum.YES.getKey());
             goods.setNormType(NormTypeEnum.S.getKey());
 

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

@@ -0,0 +1,304 @@
+package com.gree.mall.manager.logic.material.manage;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.material.manage.WebsitMPurchaseBean;
+import com.gree.mall.manager.bean.material.manage.WebsitMPurchaseItemBean;
+import com.gree.mall.manager.bean.material.manage.WebsitPurchaseApplyVO;
+import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsRelaVO;
+import com.gree.mall.manager.commonmapper.MaterialMapper;
+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.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.zfire.bean.QueryParamBean;
+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.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WebsitMPurchaseLogic {
+
+    private final CommonLogic commonLogic;
+    private final MaterialMapper materialMapper;
+    private final WebsitPurchaseService websitPurchaseService;
+    private final WebsitPurchaseItemService websitPurchaseItemService;
+    private final VenderGoodsLogic venderGoodsLogic;
+    private final WebsitVenderService websitVenderService;
+
+    public IPage<WebsitPurchaseApplyVO> page(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, WebsitPurchaseApplyVO.class, adminUser);
+
+        return materialMapper.websitPurchaseApplyPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    public WebsitMPurchaseBean detail(String purchaseId) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitMPurchaseBean bean = new WebsitMPurchaseBean();
+        WebsitPurchase purchase = websitPurchaseService.getById(purchaseId);
+        BeanUtils.copyProperties(purchase, bean);
+        bean.setImageUrl(purchase.getImageUrl());
+        String companyId = Objects.isNull(adminUser.getAdminCompanyWechat()) ? null : adminUser.getAdminCompanyWechat().getCompanyWechatId();
+        List<WebsitMPurchaseItemBean> list = websitPurchaseItemService.lambdaQuery()
+                .eq(StringUtils.isNotBlank(companyId), WebsitPurchaseItem::getCompanyWechatId, companyId)
+                .eq(WebsitPurchaseItem::getPurchaseId, purchaseId)
+                .list()
+                .stream()
+                .map(v -> {
+                    WebsitMPurchaseItemBean item = new WebsitMPurchaseItemBean();
+                    BeanUtils.copyProperties(v, item);
+                    return item;
+                }).collect(Collectors.toList());
+        bean.setItems(list);
+
+        return bean;
+    }
+
+    @Transactional
+    public void add(WebsitMPurchaseBean bean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        if (adminUser.getType() == 2) {
+            throw new RemoteServiceException("平台账号禁用操作");
+        }
+
+        bean.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
+        bean.setCompanyWechatName(adminUser.getAdminCompanyWechat().getCompanyName());
+
+        bean.setFlag(MaterialFlagEnum.SAVE.getKey());
+
+        // 检查参数值
+        this.validApplyParams(bean);
+
+        WebsitPurchase purchase = new WebsitPurchase();
+        BeanUtils.copyProperties(bean, purchase);
+
+        purchase.insert();
+
+        List<WebsitPurchaseItem> itemList = new ArrayList<>();
+        for (WebsitMPurchaseItemBean beanItem : bean.getItems()) {
+            WebsitPurchaseItem item = new WebsitPurchaseItem();
+            BeanUtils.copyProperties(beanItem, item);
+            item.setPurchaseId(purchase.getPurchaseId())
+                    .setCompanyWechatId(bean.getCompanyWechatId())
+                    .setWebsitId(bean.getWebsitId())
+                    .setWebsitName(bean.getWebsitName())
+                    .setGoodsType(WebsitGoodsTypeEnum.M.getKey());
+            itemList.add(item);
+        }
+
+        websitPurchaseItemService.saveBatch(itemList);
+    }
+
+    public void edit(WebsitMPurchaseBean bean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        bean.setFlag(MaterialFlagEnum.SAVE.getKey());
+
+        final WebsitPurchase oldPurchase = websitPurchaseService.getById(bean.getPurchaseId());
+
+        if (Objects.isNull(oldPurchase)) {
+            throw new RemoteServiceException("单据不存在");
+        }
+
+        // 检查参数值
+        this.validApplyParams(bean);
+
+        WebsitPurchase purchase = new WebsitPurchase();
+        BeanUtils.copyProperties(bean, purchase);
+        purchase.setCreateBy(oldPurchase.getCreateBy())
+                .setCreateTime(oldPurchase.getCreateTime());
+
+        purchase.updateById();
+
+        List<WebsitPurchaseItem> itemList = new ArrayList<>();
+        websitPurchaseItemService.lambdaUpdate()
+                .eq(WebsitPurchaseItem::getPurchaseId, bean.getPurchaseId())
+                .remove();
+        for (WebsitMPurchaseItemBean beanItem : bean.getItems()) {
+            WebsitPurchaseItem item = new WebsitPurchaseItem();
+            BeanUtils.copyProperties(beanItem, item);
+            item.setPurchaseId(purchase.getPurchaseId())
+                    .setCompanyWechatId(bean.getCompanyWechatId())
+                    .setWebsitId(bean.getWebsitId())
+                    .setWebsitName(bean.getWebsitName())
+                    .setGoodsType(WebsitGoodsTypeEnum.M.getKey());
+            itemList.add(item);
+        }
+
+        websitPurchaseItemService.saveBatch(itemList);
+    }
+
+    private void validApplyParams(WebsitMPurchaseBean bean) {
+        if (StringUtils.isBlank(bean.getWebsitId()) || StringUtils.isBlank(bean.getWebsitName())) {
+            throw new RemoteServiceException("请选择网点");
+        }
+        if (StringUtils.isBlank(bean.getVenderId()) || StringUtils.isBlank(bean.getVenderName())) {
+            throw new RemoteServiceException("请选择供应商");
+        }
+        if (CollectionUtil.isEmpty(bean.getItems())) {
+            throw new RemoteServiceException("请先添加明细");
+        }
+
+        for (int i = 0; i < bean.getItems().size(); i++) {
+            WebsitMPurchaseItemBean itemBean = bean.getItems().get(i);
+            String preStr = "第" + (i+1) + "行, ";
+            if (StringUtils.isBlank(itemBean.getGoodsId()) || StringUtils.isBlank(itemBean.getGoodsName())) {
+                throw new RemoteServiceException(preStr + "辅材编号不能为空");
+            }
+            if (Objects.isNull(itemBean.getApplyCost())) {
+                throw new RemoteServiceException(preStr + "预估进价不能为空");
+            }
+            if (Objects.isNull(itemBean.getApplyQty()) || itemBean.getApplyQty().compareTo(BigDecimal.ZERO) <= 0) {
+                throw new RemoteServiceException(preStr + "申请数量不能为空或少于等于0");
+            }
+        }
+
+        // 检查明细重复辅材编号
+        Map<String, List<WebsitMPurchaseItemBean>> goodsGroup = bean.getItems().stream().collect(Collectors.groupingBy(WebsitMPurchaseItemBean::getGoodsId));
+        for (Map.Entry<String, List<WebsitMPurchaseItemBean>> entry : goodsGroup.entrySet()) {
+            if (entry.getValue().size() > 1) {
+                throw new RemoteServiceException("明细有重复的辅材编号 " + entry.getKey());
+            }
+        }
+
+        // 获取供应商商品记录
+        List<WebsitVenderGoodsRelaVO> relaList = this.queryVenderGoods(bean);
+        final Map<String, WebsitVenderGoodsRelaVO> relaMap = relaList.stream()
+                .collect(Collectors.toMap(WebsitVenderGoodsRelaVO::getGoodsId, Function.identity()));
+
+        // 校验供应商商品
+        this.validVendorGoods(bean, relaMap);
+    }
+
+    private void validVendorGoods(WebsitMPurchaseBean bean, Map<String, WebsitVenderGoodsRelaVO> relaMap) {
+        for (int i = 0; i < bean.getItems().size(); i++) {
+            WebsitMPurchaseItemBean itemBean = bean.getItems().get(i);
+            String preStr = "第" + (i+1) + "行, ";
+            final WebsitVenderGoodsRelaVO relaGoods = relaMap.get(itemBean.getGoodsId());
+            if (Objects.isNull(relaGoods)) {
+                throw new RemoteServiceException(preStr + "供应商辅材不存在或无效");
+            }
+            if (StrUtil.equals(relaGoods.getStatus().getKey(), StateEnum.OFF.getKey())) {
+                throw new RemoteServiceException(preStr + "供应商辅材资料无效");
+            }
+            if (bean.getFlag().equals(MaterialFlagEnum.SAVE.getKey())) {
+                // 检查进价范围值
+                if (Objects.nonNull(relaGoods.getCostRangeMini())
+                        && itemBean.getApplyCost().compareTo(relaGoods.getCostRangeMini()) < 0) {
+                    throw new RemoteServiceException(preStr + "不能低于辅材资料最小进价范围值");
+                }
+                if (Objects.nonNull(relaGoods.getCostRangeMax())
+                        && itemBean.getApplyCost().compareTo(relaGoods.getCostRangeMax()) > 0) {
+                    throw new RemoteServiceException(preStr + "不能高于辅材资料最大进价范围值");
+                }
+            }
+            // 申请进价*申请数量=申请进价金额
+            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());
+        }
+    }
+
+    private List<WebsitVenderGoodsRelaVO> queryVenderGoods(WebsitMPurchaseBean bean) {
+        ZfireParamBean zfireParamBean = new ZfireParamBean();
+        zfireParamBean.setPageNum(1);
+        zfireParamBean.setPageSize(-1);
+        zfireParamBean.setParams(new ArrayList<>());
+        QueryParamBean paramBean = new QueryParamBean();
+        paramBean.setParam("a.vender_id").setCompare("=").setValue(bean.getVenderId());
+        QueryParamBean paramBean2 = new QueryParamBean();
+        paramBean2.setParam("a.rela_status").setCompare("=").setValue(StateEnum.ON.getKey());
+        zfireParamBean.getParams().add(paramBean);
+        zfireParamBean.getParams().add(paramBean2);
+
+        final IPage<WebsitVenderGoodsRelaVO> page = venderGoodsLogic.ralaPage(zfireParamBean);
+        if (CollectionUtil.isEmpty(page.getRecords())) {
+            throw new RemoteServiceException(bean.getVenderName() + "供应商没有可供应的辅材记录");
+        }
+        return page.getRecords();
+    }
+
+    @Transactional
+    public void batchDel(List<String> purchaseIds) {
+        if (CollectionUtil.isEmpty(purchaseIds)) {
+            throw new RemoteServiceException("请选择记录");
+        }
+
+        websitPurchaseService.lambdaUpdate()
+                .in(WebsitPurchase::getPurchaseId, purchaseIds)
+                .remove();
+
+        websitPurchaseItemService.lambdaUpdate()
+                .in(WebsitPurchaseItem::getPurchaseId, purchaseIds)
+                .remove();
+    }
+
+    @Transactional
+    public void revoke(String purchaseId) {
+        if (!websitPurchaseService.lambdaUpdate()
+                .eq(WebsitPurchase::getPurchaseId, purchaseId)
+                .eq(WebsitPurchase::getFlag, MaterialFlagEnum.SUBMIT.getKey())
+                .eq(WebsitPurchase::getIsRecheck, IsYesNoEnum.NO.getKey())
+                .set(WebsitPurchase::getFlag, MaterialFlagEnum.SAVE.getKey())
+                .update()) {
+            throw new RemoteServiceException("撤消失败,单据状态已发生变化,非“提交待核实”");
+        }
+    }
+
+    @Transactional
+    public void submit(String purchaseId) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitPurchase purchase = websitPurchaseService.getById(purchaseId);
+
+        if (Objects.isNull(purchase) || !StrUtil.equals(purchase.getFlag(), MaterialFlagEnum.SAVE.getKey())) {
+            throw new RemoteServiceException("单据不存在或状态已发生变化");
+        }
+
+        final WebsitVender vender = websitVenderService.getById(purchase.getVenderId());
+
+        // 供应商为自动审核时
+        if (StrUtil.equals(vender.getIsAuto(), IsYesNoEnum.YES.getKey())) {
+            purchase.setIsRecheck(IsYesNoEnum.YES.getKey())
+                    .setCheckBy(adminUser.getNickName())
+                    .setCheckTime(DateUtil.date());
+        }
+
+        purchase.setFlag(MaterialFlagEnum.SUBMIT.getKey())
+                .setSubmitBy(adminUser.getNickName())
+                .setSubmitTime(DateUtil.date())
+                .updateById();
+    }
+}

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

@@ -277,6 +277,12 @@ public class WebsitSalesLogic {
                 item.setOrigPartsPrice(goods.getMarketPrice());
             }
 
+            // 商品类型为辅材并且库存单位与销售单位一致时转换系数为1
+            if (sales.getGoodsType().equals(WebsitGoodsTypeEnum.M.getKey())
+                    && StrUtil.equals(StrUtil.trim(goods.getGoodsStockUnit()), StrUtil.trim(goods.getGoodsSalesUnit()))) {
+                goods.setGoodsSalesConvertQty(BigDecimal.ONE);
+            }
+
             BigDecimal convertQty = item.getSalesQty().divide(goods.getGoodsSalesConvertQty(), 1, BigDecimal.ROUND_UP);
             BigDecimal totalSaleValue = item.getSalesQty().multiply(item.getPrice());
             BigDecimal convertPrice = totalSaleValue.divide(convertQty, 2, BigDecimal.ROUND_DOWN);
@@ -910,6 +916,10 @@ public class WebsitSalesLogic {
                         salesItemBean.setPayType(salesBean.getPayType());
                         salesItemBean.setManageWorkerStock(bean.getGoods().getManageWorkerStock());
 
+                        if (StrUtil.equals(salesItemBean.getGoodsStockUnit(), salesItemBean.getGoodsSalesUnit())) {
+                            bean.getGoods().setGoodsSalesConvertQty(BigDecimal.ONE);
+                        }
+
                         BigDecimal convertQty = salesItemBean.getSalesQty().divide(bean.getGoods().getGoodsSalesConvertQty(), 1, BigDecimal.ROUND_UP);
                         BigDecimal totalSaleValue = salesItemBean.getSalesQty().multiply(salesItemBean.getPrice());
                         BigDecimal convertPrice = totalSaleValue.divide(convertQty, 2, BigDecimal.ROUND_DOWN);

+ 176 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/vender/VenderGoodsLogic.java

@@ -0,0 +1,176 @@
+package com.gree.mall.manager.logic.material.vender;
+
+import cn.hutool.core.collection.CollectionUtil;
+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.vender.WebsitVenderGoodsBean;
+import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsRelaVO;
+import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsVO;
+import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.enums.ExamineStatusEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.plus.entity.WebsitVenderGoods;
+import com.gree.mall.manager.plus.entity.WebsitVenderGoodsItem;
+import com.gree.mall.manager.plus.entity.WebsitVenderGoodsRela;
+import com.gree.mall.manager.plus.service.WebsitVenderGoodsItemService;
+import com.gree.mall.manager.plus.service.WebsitVenderGoodsRelaService;
+import com.gree.mall.manager.plus.service.WebsitVenderGoodsService;
+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.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+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 VenderGoodsLogic {
+
+    private final CommonLogic commonLogic;
+    private final MaterialMapper materialMapper;
+    private final WebsitVenderGoodsService websitVenderGoodsService;
+    private final WebsitVenderGoodsItemService websitVenderGoodsItemService;
+    private final WebsitVenderGoodsRelaService websitVenderGoodsRelaService;
+
+    public IPage<WebsitVenderGoodsVO> page(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, WebsitVenderGoodsVO.class, adminUser);
+        return materialMapper.websitVenderGoodsPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    public WebsitVenderGoodsBean detail(String id) {
+        WebsitVenderGoods goods = websitVenderGoodsService.getById(id);
+        WebsitVenderGoodsBean bean = new WebsitVenderGoodsBean();
+
+        BeanUtils.copyProperties(goods, bean);
+        final List<WebsitVenderGoodsItem> items = websitVenderGoodsItemService.lambdaQuery()
+                .eq(WebsitVenderGoodsItem::getSheetId, goods.getSheetId())
+                .list();
+        bean.setItems(items);
+
+        return bean;
+    }
+
+    @Transactional
+    public void add(WebsitVenderGoodsBean bean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        bean.setSheetId(IdWorker.getIdStr());
+        this.checkParams(bean);
+
+        if (Objects.nonNull(adminUser.getAdminCompanyWechat())) {
+            bean.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
+            bean.setCompanyWechatName(adminUser.getAdminCompanyWechat().getCompanyName());
+        }
+
+        bean.setStatus(ExamineStatusEnum.SAVE.getKey())
+                .insert();
+        if (CollectionUtil.isNotEmpty(bean.getItems())) {
+            websitVenderGoodsItemService.saveBatch(bean.getItems());
+        }
+    }
+
+    private void checkParams(WebsitVenderGoodsBean bean) {
+        if (StringUtils.isBlank(bean.getVenderId())) {
+            throw new RemoteServiceException("请选择供应商");
+        }
+
+        if (CollectionUtil.isNotEmpty(bean.getItems())) {
+            for (int i = 0; i < bean.getItems().size(); i++) {
+                final WebsitVenderGoodsItem item = bean.getItems().get(i);
+                if (StringUtils.isBlank(item.getGoodsId())) {
+                    throw new RemoteServiceException("第" + (i+1) + "行, 辅材编号不能为空");
+                }
+                item.setSheetId(bean.getSheetId());
+            }
+        }
+    }
+
+    @Transactional
+    public void edit(WebsitVenderGoodsBean bean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        this.checkParams(bean);
+
+        bean.setStatus(ExamineStatusEnum.SAVE.getKey())
+                .updateById();
+
+        websitVenderGoodsItemService.lambdaUpdate()
+                .eq(WebsitVenderGoodsItem::getSheetId, bean.getSheetId())
+                .remove();
+        if (CollectionUtil.isNotEmpty(bean.getItems())) {
+            websitVenderGoodsItemService.saveBatch(bean.getItems());
+        }
+    }
+
+    @Transactional
+    public void confirm(WebsitVenderGoodsBean bean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        this.edit(bean);
+        bean.setStatus(ExamineStatusEnum.OK.getKey())
+                .setConfirmBy(adminUser.getNickName())
+                .setConfirmTime(DateUtil.date())
+                .updateById();
+
+        if (CollectionUtil.isNotEmpty(bean.getItems())) {
+            List<WebsitVenderGoodsRela> relaList = websitVenderGoodsRelaService.lambdaQuery()
+                    .eq(WebsitVenderGoodsRela::getCompanyWechatId, bean.getCompanyWechatId())
+                    .eq(WebsitVenderGoodsRela::getVenderId, bean.getVenderId())
+                    .in(WebsitVenderGoodsRela::getGoodsId, bean.getItems().stream()
+                            .map(WebsitVenderGoodsItem::getGoodsId)
+                            .collect(Collectors.toList()))
+                    .list();
+
+            Map<String, WebsitVenderGoodsRela> relaMap = relaList.stream().collect(Collectors.toMap(WebsitVenderGoodsRela::getGoodsId, Function.identity()));
+
+            List<WebsitVenderGoodsRela> goodsRelaList = new ArrayList<>();
+            for (WebsitVenderGoodsItem item : bean.getItems()) {
+                WebsitVenderGoodsRela goodsRela = relaMap.get(item.getGoodsId());
+                if (Objects.isNull(goodsRela)) {
+                    goodsRela = new WebsitVenderGoodsRela();
+                    goodsRela.setCompanyWechatId(bean.getCompanyWechatId())
+                            .setCompanyWechatName(bean.getCompanyWechatName())
+                            .setVenderId(bean.getVenderId())
+                            .setVenderName(bean.getVenderName())
+                            .setGoodsId(item.getGoodsId())
+                            .setGoodsName(item.getGoodsName())
+                            .setCost(item.getCost())
+                            .setRelaStatus(item.getStatus());
+                } else {
+                    goodsRela.setCost(item.getCost())
+                            .setRelaStatus(item.getStatus());
+                }
+
+                goodsRelaList.add(goodsRela);
+            }
+
+            websitVenderGoodsRelaService.saveOrUpdateBatch(goodsRelaList);
+        }
+    }
+
+    @Transactional
+    public void del(List<String> ids) {
+        websitVenderGoodsService.removeByIds(ids);
+        websitVenderGoodsItemService.lambdaUpdate()
+                .eq(WebsitVenderGoodsItem::getSheetId, ids)
+                .remove();
+    }
+
+    public IPage<WebsitVenderGoodsRelaVO> ralaPage(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, WebsitVenderGoodsRelaVO.class, adminUser);
+        return materialMapper.websitVenderGoodsRalaPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+}

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

@@ -395,4 +395,43 @@
         </where>
 
     </select>
+    <select id="websitVenderGoodsPage"
+            resultType="com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsVO">
+        SELECT
+            ${ex.selected}
+        FROM websit_vender_goods a
+            ${ex.query}
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
+    <select id="websitVenderGoodsRalaPage"
+            resultType="com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsRelaVO">
+        SELECT
+            ${ex.selected}
+        FROM
+            websit_vender_goods_rela a
+            JOIN websit_goods b ON a.company_wechat_id = b.company_wechat_id AND a.goods_id = b.goods_id
+            LEFT JOIN websit_goods_category c ON b.goods_category_id = c.category_id
+        ${ex.query}
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
+    <select id="websitPurchaseApplyPage"
+            resultType="com.gree.mall.manager.bean.material.manage.WebsitPurchaseApplyVO">
+        SELECT
+            ${ex.selected}
+        FROM
+            websit_purchase a
+        ${ex.query}
+        <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


BIN
mall-server-api/src/main/resources/template/辅材收费标准模板(物料收费).xlsx


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


BIN
mall-server-api/src/main/resources/template/配件模板(服务收费).xlsx


BIN
mall-server-api/src/main/resources/template/配件模板(配件物料).xlsx