Explorar o código

Merge branch 'zx_saas_goods' of http://git.dayaedu.com/yonge/mec into zx_saas_goods

刘俊驰 hai 1 ano
pai
achega
26a963892c

+ 2 - 1
mec-application/src/main/java/com/ym/mec/teacher/controller/GoodsController.java

@@ -2,6 +2,7 @@ package com.ym.mec.teacher.controller;
 
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.GoodsCategory;
+import com.ym.mec.biz.dal.wrapper.GoodsWrapper;
 import com.ym.mec.biz.service.GoodsCategoryService;
 import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.common.controller.BaseController;
@@ -29,7 +30,7 @@ public class GoodsController extends BaseController {
     @ApiOperation(value = "根据商品(教材、辅件)编号查询商品(教材、辅件)")
     @GetMapping("/get/{id}")
     public Object get(@ApiParam(value = "商品(教材、辅件)编号", required = true) @PathVariable("id") Integer id) {
-        Goods goods = goodsService.getDetail(id);
+        GoodsWrapper.Goods goods = goodsService.getDetail(id);
         GoodsCategory goodsCategory = goodsCategoryService.get(goods.getGoodsCategoryId());
         if (Objects.nonNull(goodsCategory)) {
             goods.setGoodsCategoryName(goodsCategory.getName());

+ 14 - 4
mec-application/src/main/java/com/ym/mec/web/controller/GoodsController.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.entity.GoodsProcurement;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.GoodsQuery;
 import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.biz.dal.wrapper.GoodsWrapper;
 import com.ym.mec.biz.service.GoodsCategoryService;
 import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.SysUserService;
@@ -40,7 +41,7 @@ public class GoodsController extends BaseController {
     @ApiOperation(value = "新增商品(教材、辅件)")
     @PostMapping("/add")
     @PreAuthorize("@pcs.hasPermissions('goods/add')")
-    public Object add(Goods goods){
+    public Object add(GoodsWrapper.Goods goods){
         goodsService.addGoods(goods,sysUserService.getUserId());
         return succeed();
     }
@@ -79,16 +80,16 @@ public class GoodsController extends BaseController {
     @ApiOperation(value = "修改商品(教材、辅件)")
     @PostMapping("/update")
     @PreAuthorize("@pcs.hasPermissions('goods/update')")
-    public Object update(Goods goods){
+    public Object update(GoodsWrapper.Goods goods){
         goods.setUpdateTime(new Date());
-        goodsService.update(goods);
+        goodsService.updateGoods(goods);
         return succeed();
     }
 
     @ApiOperation(value = "根据商品(教材、辅件)编号查询商品(教材、辅件)")
     @GetMapping("/get/{id}")
     public Object get(@ApiParam(value = "商品(教材、辅件)编号", required = true) @PathVariable("id") Integer id){
-        Goods goods = goodsService.getDetail(id);
+        GoodsWrapper.Goods goods = goodsService.getDetail(id);
         GoodsCategory goodsCategory = goodsCategoryService.get(goods.getGoodsCategoryId());
         if(Objects.nonNull(goodsCategory)){
             goods.setGoodsCategoryName(goodsCategory.getName());
@@ -120,4 +121,13 @@ public class GoodsController extends BaseController {
     public Object findGoodsBySubId(GoodsQuery goodsQuery){
         return succeed(goodsService.findGoodsBySubId(goodsQuery));
     }
+
+
+    @ApiOperation(value = "查询商城商品列表分页")
+    @GetMapping("/queryGoodsSubByPage")
+    @PreAuthorize("@pcs.hasPermissions('goods/queryGoodsSubByPage')")
+    public Object queryGoodsSubByPage(GoodsWrapper.GoodsSubQuery query) {
+        return succeed(goodsService.queryGoodsSubByPage(query));
+
+    }
 }

+ 49 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/GoodsSub.java

@@ -0,0 +1,49 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+import java.math.BigDecimal;
+
+/**
+ * 组合商品,子商品信息
+ * 2024-02-21 16:24:38
+ */
+@Data
+@ApiModel(" GoodsSub-组合商品,子商品信息")
+@TableName("goods_sub")
+public class GoodsSub implements Serializable {
+
+    @ApiModelProperty("id")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("商品编号")
+    @TableField(value = "goods_id_")
+    private Integer goodsId;
+
+    @ApiModelProperty("商城商品编号")
+    @TableField(value = "mall_goods_id_")
+    private Integer mallGoodsId;
+
+    @ApiModelProperty("sku编号")
+    @TableField(value = "sku_")
+    private Integer sku;
+
+    @ApiModelProperty("商品状态,1:上架、0:下架")
+    @TableField(value = "goods_status_")
+    private Boolean goodsStatus;
+
+    @ApiModelProperty("成本")
+    @TableField(value = "goods_price_")
+    private BigDecimal goodsPrice;
+
+}

+ 19 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/GoodsSubMapper.java

@@ -0,0 +1,19 @@
+package com.ym.mec.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.GoodsSub;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 组合商品,子商品信息
+ * 2024-02-21 16:24:38
+ */
+@Repository
+public interface GoodsSubMapper extends BaseMapper<GoodsSub> {
+
+
+    void saveBatch(@Param("goodsSubs") List<GoodsSub> goodsSubs);
+}

+ 231 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/GoodsWrapper.java

@@ -0,0 +1,231 @@
+package com.ym.mec.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.dal.enums.StockType;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class GoodsWrapper {
+
+    @ApiModel("商品")
+    @Data
+    public static class Goods {
+
+        @ApiModelProperty(value = "商品编号")
+        private Integer id;
+
+        @ApiModelProperty(value = "产品分类")
+        private Integer goodsCategoryId;
+
+        @ApiModelProperty(value = "产品分类名称")
+        private String goodsCategoryName;
+
+        @ApiModelProperty(value = "商品货号")
+        private String sn;
+
+        @ApiModelProperty(value = "商品名称")
+        private String name;
+
+        @ApiModelProperty(value = "品牌")
+        private String brand;
+
+        @ApiModelProperty(value = "规格")
+        private String specification;
+
+        @ApiModelProperty(value = "展示图片的地址")
+        private String image;
+
+        @ApiModelProperty(value = "库存数量")
+        private Integer stockCount;
+
+        @ApiModelProperty(value = "税务库存")
+        private Integer taxStockCount;
+
+        @ApiModelProperty(value = "总销量数")
+        private Integer sellCount;
+
+        @ApiModelProperty(value = "市场销售价")
+        private BigDecimal marketPrice;
+
+        @ApiModelProperty(value = "商品零售价")
+        private BigDecimal discountPrice;
+
+        @ApiModelProperty(value = "团购价")
+        private BigDecimal groupPurchasePrice;
+
+        @ApiModelProperty(value = "商品价格1")
+        private BigDecimal costPrice;
+
+        @ApiModelProperty(value = "协议成本价")
+        private BigDecimal agreeCostPrice;
+
+        @ApiModelProperty(value = "分部成本价")
+        private BigDecimal organCostPrice;
+
+        @ApiModelProperty(value = "页面简介")
+        private String brief;
+
+        @ApiModelProperty(value = "商品的详细描述")
+        private String desc;
+
+        @ApiModelProperty(value = "是否是新品(1,是  0,否)")
+        private YesOrNoEnum isNew;
+
+        @ApiModelProperty(value = "是否置顶(1,置顶   0,不置顶)")
+        private YesOrNoEnum isTop;
+
+        @ApiModelProperty(value = "状态(1,上架  0,下架)")
+        private YesOrNoEnum status;
+
+        @ApiModelProperty(value = "备注")
+        private String memo;
+
+        @ApiModelProperty(value = "发布时间")
+        private java.util.Date publishTime;
+
+        @ApiModelProperty(value = "附件商品列表编号(用逗号分开)")
+        private String complementGoodsIdList;
+
+        @ApiModelProperty(value = "辅件列表(子商品)")
+        private List<com.ym.mec.biz.dal.entity.Goods> goodsList;
+
+        private String subjectIds;
+
+        private java.util.Date createTime;
+
+        private java.util.Date updateTime;
+
+        @ApiModelProperty(value = "商品类型")
+        private GoodsType type;
+
+        @ApiModelProperty(value = "备查货号,进货渠道")
+        private String supplyChannel;
+
+        @ApiModelProperty(value = "客户端展示分部")
+        private String studentShowOrganId;
+
+        @ApiModelProperty(value = "教务端展示分部")
+        private String educationShowOrganId;
+
+        @ApiModelProperty(value = "课程收费团展示分部")
+        private String courseFeeShowOrganId;
+
+        @ApiModelProperty(value = "会员收费团展示分部")
+        private String memberFeeShowOrganId;
+
+        @ApiModelProperty(value = "免费团展示分部")
+        private String freeFeeShowOrganId;
+
+        @ApiModelProperty(value = "乐器置换展示分部")
+        private String replacementShowOrganId;
+
+        @ApiModelProperty(value = "客户端展示分部")
+        private String studentShowOrganName;
+
+        @ApiModelProperty(value = "教务端展示分部")
+        private String educationShowOrganName;
+
+        @ApiModelProperty(value = "课程收费团展示分部")
+        private String courseFeeShowOrganName;
+
+        @ApiModelProperty(value = "会员收费团展示分部")
+        private String memberFeeShowOrganName;
+
+        @ApiModelProperty(value = "免费团展示分部")
+        private String freeFeeShowOrganName;
+
+        @ApiModelProperty(value = "乐器置换展示分部")
+        private String replacementShowOrganName;
+
+        @ApiModelProperty(value = "库存类型")
+        private StockType stockType;
+
+        @ApiModelProperty(value = "库存预警")
+        private YesOrNoEnum stockWarning;
+
+        private Integer tenantId = TenantContextHolder.getTenantId();
+
+        private String childId;
+
+        private String childName;
+
+        private String childSn;
+
+        private String childOrganCostPrice;
+
+        private List<GoodsSub> goodsSubList = new ArrayList<>();
+
+        @Override
+        public String toString() {
+            return ToStringBuilder.reflectionToString(this);
+        }
+    }
+
+
+    @Data
+    @ApiModel(" GoodsSub_-组合商品,子商品信息")
+    public static class GoodsSub {
+
+        @ApiModelProperty("id")
+        private Integer id;
+
+        @ApiModelProperty("商品编号")
+        private Integer goodsId;
+
+        @ApiModelProperty("商城商品编号")
+        private Integer mallGoodsId;
+
+        @ApiModelProperty("sku编号")
+        private Integer sku;
+
+        @ApiModelProperty("商品状态,1:上架、0:下架")
+        private Boolean goodsStatus;
+
+        @ApiModelProperty("成本")
+        private BigDecimal goodsPrice;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static GoodsSub from(String json) {
+            return JSON.parseObject(json, GoodsSub.class);
+        }
+    }
+
+
+    @Data
+    @ApiModel("商城商品分页查询参数")
+    public static class GoodsSubQuery extends QueryInfo {
+
+        @ApiModelProperty("上架状态,1:上架,0:下架")
+        private Integer publishStatus;
+
+        @ApiModelProperty("商品名称模糊关键字")
+        private String keyword;
+
+        @ApiModelProperty("商品货号")
+        private String productSn;
+
+        @ApiModelProperty("商品编号,多个逗号隔开")
+        private String productIds;
+
+        @ApiModelProperty("商品分类")
+        private Long productCategoryId;
+
+        @ApiModelProperty("商品品牌")
+        private Long brandId;
+
+    }
+
+}

+ 8 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/GoodsService.java

@@ -3,6 +3,8 @@ package com.ym.mec.biz.service;
 import java.util.List;
 
 import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.biz.dal.wrapper.GoodsWrapper;
+import com.ym.mec.common.dto.PmsProductDto;
 import com.ym.mec.common.page.PageInfo;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -18,7 +20,7 @@ public interface GoodsService extends BaseService<Integer, Goods> {
 
     List<Goods> exportGoods(GoodsQueryInfo queryInfo);
 
-    void addGoods(Goods goods, Integer operatorId);
+    void addGoods(GoodsWrapper.Goods goods, Integer operatorId);
 
     void addGoodsProcurement(GoodsProcurement goodsProcurement);
 
@@ -126,9 +128,13 @@ public interface GoodsService extends BaseService<Integer, Goods> {
      * @param goodsId
      * @return
      */
-    Goods getDetail(Integer goodsId);
+    GoodsWrapper.Goods getDetail(Integer goodsId);
     
     List<Goods> getGoodsWithLocked(String goodsIds);
     
     int batchUpdate(List<Goods> goodsList);
+
+    void updateGoods(GoodsWrapper.Goods goods);
+
+    PageInfo<PmsProductDto> queryGoodsSubByPage(GoodsWrapper.GoodsSubQuery query);
 }

+ 85 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java

@@ -2,23 +2,29 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.ComplementGoodsDto;
 import com.ym.mec.biz.dal.dto.GoodsSellDto;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.GoodsProcurement;
+import com.ym.mec.biz.dal.entity.GoodsSub;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.SellOrder;
 import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.mapper.GoodsSubMapper;
 import com.ym.mec.biz.dal.page.GoodsQuery;
 import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.biz.dal.wrapper.GoodsWrapper;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dto.PmsProductDto;
 import com.ym.mec.common.dto.PmsProductQueryParamDto;
 import com.ym.mec.common.entity.UploadReturnBean;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
@@ -32,6 +38,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.PictureData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
@@ -73,6 +80,8 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	@Resource
 	private MallFeignService mallFeignService;
 
+	@Autowired
+	private GoodsSubMapper goodsSubMapper;
 	@Override
 	public BaseDAO<Integer, Goods> getDAO() {
 		return goodsDao;
@@ -162,20 +171,17 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void addGoods(Goods goods, Integer operatorId) {
+	public void addGoods(GoodsWrapper.Goods goods, Integer operatorId) {
 		if(StringUtils.isBlank(goods.getSn())){
 			throw new BizException("请指定商品货号");
 		}
-		if(StringUtils.isEmpty(goods.getComplementGoodsJson())){
-			throw new BizException("请指定子商品");
-		}
 		Goods existsGood = goodsDao.lockBySn(goods.getSn());
 		if(Objects.nonNull(existsGood)){
 			throw new BizException("商品货号重复");
 		}
-		List<ComplementGoodsDto> complementGoods = JSON.parseArray(goods.getComplementGoodsJson(), ComplementGoodsDto.class);
+		List<GoodsWrapper.GoodsSub> goodsSubList = goods.getGoodsSubList();
 		//获取最小的库存数
-		String skuIds = complementGoods.stream().map(e -> e.getSkuStockId().toString()).collect(Collectors.joining(","));
+		String skuIds = goodsSubList.stream().map(e -> e.getSku().toString()).collect(Collectors.joining(","));
 		PmsProductQueryParamDto paramDto = new PmsProductQueryParamDto();
 		paramDto.setSkuStockIds(skuIds);
 		paramDto.setPublishStatus(1);
@@ -189,7 +195,14 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		Integer stock = productList.stream().map(PmsProductDto::getStock).min(Integer::compareTo).get();
 		goods.setStockCount(stock);
 		goods.setSellCount(0);
-		goodsDao.insert(goods);
+		Goods goodsRecord = new Goods();
+		BeanUtils.copyProperties(goods,goodsRecord);
+		BigDecimal organCostPrice = goodsSubList.stream().map(GoodsWrapper.GoodsSub::getGoodsPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+		goodsRecord.setOrganCostPrice(organCostPrice);
+		goodsDao.insert(goodsRecord);
+		List<GoodsSub> goodsSubs = JSON.parseArray(JSON.toJSONString(goodsSubList), GoodsSub.class);
+		goodsSubs.forEach(next -> next.setGoodsId(goodsRecord.getId()));
+		goodsSubMapper.saveBatch(goodsSubs);
 	}
 
 	@Override
@@ -245,6 +258,13 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 					throw new BizException("{}等商品还在销售中", goodsNames);
 				}
 			}
+			List<GoodsSub> goodsSubs = queryGoodsSub(goodsId);
+			if (!CollectionUtils.isEmpty(goodsSubs) && status == 1) {
+				long falseSize = goodsSubs.stream().map(GoodsSub::getGoodsStatus).filter(Boolean.FALSE::equals).count();
+				if (falseSize > 0) {
+					throw new BizException("存在已下架的子商品");
+				}
+			}
 		}else{
 			if(status==1){
 				List<Integer> goodsIds = Arrays.stream(goods.getComplementGoodsIdList().split(",")).map(s -> Integer.valueOf(s)).collect(Collectors.toList());
@@ -259,6 +279,14 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		goodsDao.update(goods);
 	}
 
+	private List<GoodsSub> queryGoodsSub(Integer goodsId) {
+		// 从管乐迷商城组合的商品
+		QueryWrapper<GoodsSub> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("goods_id_", goodsId);
+		List<GoodsSub> goodsSubs = goodsSubMapper.selectList(queryWrapper);
+		return goodsSubs;
+	}
+
 	@Override
 	public List<Goods> findGoodsBySubId(GoodsQuery goodsQuery) {
 		return goodsDao.findGoodsBySubId(goodsQuery);
@@ -729,7 +757,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	}
 
 	@Override
-	public Goods getDetail(Integer goodsId) {
+	public GoodsWrapper.Goods getDetail(Integer goodsId) {
 		Goods goods = goodsDao.get(goodsId);
 		if(StringUtils.isNotEmpty(goods.getStudentShowOrganId())){
 			goods.setStudentShowOrganName(StringUtils.join(organizationDao.findByOrganIds(goods.getStudentShowOrganId()),","));
@@ -749,7 +777,11 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		if(StringUtils.isNotEmpty(goods.getFreeFeeShowOrganId())){
 			goods.setFreeFeeShowOrganName(StringUtils.join(organizationDao.findByOrganIds(goods.getFreeFeeShowOrganId()),","));
 		}
-		return goods;
+		List<GoodsSub> goodsSubs = queryGoodsSub(goodsId);
+		GoodsWrapper.Goods detail = new GoodsWrapper.Goods();
+		BeanUtils.copyProperties(goods, detail);
+		detail.setGoodsSubList(JSON.parseArray(JSON.toJSONString(goodsSubs), GoodsWrapper.GoodsSub.class));
+		return detail;
 	}
 
 	@Override
@@ -762,4 +794,48 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	public int batchUpdate(List<Goods> goodsList) {
 		return goodsDao.batchUpdate(goodsList);
 	}
+
+	@Transactional(rollbackFor = Exception.class)
+	@Override
+	public void updateGoods(GoodsWrapper.Goods goods) {
+		Goods goodsInfo = goodsDao.getGoodsInfo(goods.getId());
+		if (goodsInfo == null) {
+			throw new BizException("参数错误");
+		}
+		List<GoodsWrapper.GoodsSub> goodsSubList = goods.getGoodsSubList();
+		if (StringUtils.isEmpty(goodsInfo.getComplementGoodsIdList()) && goodsSubList.isEmpty()) {
+			throw new BizException("子商品信息不能为空");
+		}
+		goodsInfo.setStatus(null);
+		BeanUtils.copyProperties(goods, goodsInfo);
+		if (!goodsSubList.isEmpty()) {
+			goodsInfo.setComplementGoodsIdList(null);
+			UpdateWrapper<GoodsSub> delWrapper = new UpdateWrapper<>();
+			delWrapper.eq("goods_id_", goods.getId());
+			goodsSubMapper.delete(delWrapper);
+
+			List<GoodsSub> goodsSubs = JSON.parseArray(JSON.toJSONString(goodsSubList), GoodsSub.class);
+			goodsSubs.forEach(next -> next.setGoodsId(goods.getId()));
+			goodsSubMapper.saveBatch(goodsSubs);
+
+			BigDecimal organCostPrice = goodsSubList.stream().map(GoodsWrapper.GoodsSub::getGoodsPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+			goodsInfo.setOrganCostPrice(organCostPrice);
+		}
+		update(goodsInfo);
+	}
+
+    @Override
+    public PageInfo<PmsProductDto> queryGoodsSubByPage(GoodsWrapper.GoodsSubQuery query) {
+		PmsProductQueryParamDto dto = PmsProductQueryParamDto.builder()
+				.publishStatus(query.getPublishStatus())
+				.keyword(query.getKeyword())
+				.productSn(query.getProductSn())
+				.productIds(query.getProductIds())
+				.productCategoryId(query.getProductCategoryId())
+				.brandId(query.getBrandId())
+				.pageNum(query.getPage())
+				.pageSize(query.getRows())
+				.build();
+		return mallFeignService.getProductList(dto);
+	}
 }

+ 24 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderGoodsServiceImpl.java

@@ -1,12 +1,12 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.GoodsDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderGoodsDao;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentBaseCalender;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderActivity;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderGoods;
-import com.ym.mec.biz.dal.entity.VipGroupActivity;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderBaseService;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderGoodsService;
 import org.apache.commons.collections.CollectionUtils;
@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Service("musicGroupPaymentCalenderGoodsService")
@@ -30,6 +31,8 @@ public class MusicGroupPaymentCalenderGoodsServiceImpl extends ServiceImpl<Music
         return this.baseMapper;
     }
 
+    private GoodsDao goodsDao;
+
     @Override
     public MusicGroupPaymentCalender.PaymentCalenderStatusEnum checkComponentAmount(MusicGroupPaymentBaseCalender baseCalender) {
         return null;
@@ -37,23 +40,33 @@ public class MusicGroupPaymentCalenderGoodsServiceImpl extends ServiceImpl<Music
 
     @Override
     public BigDecimal getActualAmount(MusicGroupPaymentBaseCalender baseCalender) {
-        return null;
+        List<MusicGroupPaymentCalenderGoods> goodsList = baseCalender.getCalenderGoodsList();
+        if(CollectionUtils.isNotEmpty(goodsList)){
+            //计算现价
+            return JSONObject.parseObject(baseCalender.getCalenderFeeJson()).getBigDecimal("allTotal");
+        }
+        return BigDecimal.ZERO;
     }
 
     @Override
     public BigDecimal getOriginalAmount(MusicGroupPaymentBaseCalender musicGroupPaymentBaseCalender) {
         List<MusicGroupPaymentCalenderGoods> goodsList = musicGroupPaymentBaseCalender.getCalenderGoodsList();
-//        if(CollectionUtils.isNotEmpty(goodsList)){
-//            List<Integer> collect = calenderActivityList.stream().map(e -> e.getActivityId()).collect(Collectors.toList());
-//            List<VipGroupActivity> vipGroupActivities = vipGroupActivityDao.queryByIds(StringUtils.join(collect, ","));
-//            return vipGroupActivities.stream().map(e->fun.apply(e)).reduce(BigDecimal.ZERO,BigDecimal::add);
-//        }
+        if(CollectionUtils.isNotEmpty(goodsList)){
+            List<Integer> goodsIds = goodsList.stream().map(e -> e.getGoodsId()).collect(Collectors.toList());
+            List<Goods> goodies = goodsDao.getGoodies(goodsIds);
+            Map<Integer,Goods> goodsMap = goodies.stream().collect(Collectors.toMap(Goods::getId, e -> e));
+            //计算原价
+            return goodsList.stream().map(e -> {
+                Goods goods = goodsMap.get(e.getGoodsId());
+                return goods.getGroupPurchasePrice().multiply(new BigDecimal(e.getNum()));
+            }).reduce(BigDecimal.ZERO,BigDecimal::add);
+        }
         return BigDecimal.ZERO;
     }
 
     @Override
     public BigDecimal getCurrentAmount(MusicGroupPaymentBaseCalender baseCalender) {
-        return null;
+        return getOriginalAmount(baseCalender);
     }
 
     @Override

+ 24 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -2,7 +2,6 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
@@ -25,24 +24,17 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
-import com.ym.mec.util.excel.POIUtil;
-import com.ym.mec.util.ini.IniFileUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.ModelMap;
-import org.springframework.web.multipart.MultipartFile;
 
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -112,6 +104,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
     @Autowired
+    private MusicGroupPaymentCalenderAddressService musicGroupPaymentCalenderAddressService;
+    @Autowired
     private MusicGroupPaymentCalenderGoodsServiceImpl musicGroupPaymentCalenderGoodsService;
     @Autowired
     private MusicGroupPaymentCalenderActivityServiceImpl musicGroupPaymentCalenderActivityService;
@@ -298,6 +292,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
         BigDecimal originalTotalAmount = courseOriginalAmount.add(memberOriginalAmount)
                 .add(activityOriginalAmount)
+                .add(goodsOriginalAmount)
                 .add(repairOriginalAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
 
         //计算缴费项目总金额(前端录入)
@@ -309,6 +304,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
         BigDecimal actualTotalAmount = courseActualAmount.add(memberActualAmount)
                 .add(repairActualAmount)
+                .add(goodsActualAmount)
                 .add(activityActualAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
         //标记是否云教练缴费
         if(musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
@@ -350,7 +346,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
                 BigDecimal memberCurrentAmount = musicGroupPaymentCalenderMemberService.getCurrentAmount(musicGroupPaymentBaseCalender);
                 BigDecimal repairCurrentAmount = musicGroupPaymentCalenderRepairService.getCurrentAmount(musicGroupPaymentBaseCalender);
                 BigDecimal activityCurrentAmount = musicGroupPaymentCalenderActivityService.getCurrentAmount(musicGroupPaymentBaseCalender);
+                BigDecimal goodsCurrentAmount = musicGroupPaymentCalenderGoodsService.getCurrentAmount(musicGroupPaymentBaseCalender);
                 BigDecimal currentTotalAmount = courseCurrentAmount.add(memberCurrentAmount)
+                        .add(goodsCurrentAmount)
                         .add(repairCurrentAmount)
                         .add(activityCurrentAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
                 status = actualTotalAmount.compareTo(currentTotalAmount) == 0 ? NO : AUDITING;
@@ -434,6 +432,15 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
             musicGroupPaymentCalender.setMusicGroupPaymentCalenderCourseSettingsList(courseSettingsList);
             musicGroupPaymentCalenderCourseSettingsService.batchInsert(musicGroupPaymentCalender);
         }
+        //保存商品缴费信息
+        if (musicGroupPaymentCalender.getPaymentType() == GOODS_PURCHASE) {
+            if(CollectionUtils.isNotEmpty(musicGroupPaymentBaseCalender.getCalenderGoodsList())){
+                musicGroupPaymentCalenderGoodsService.saveBatch(musicGroupPaymentBaseCalender.getCalenderGoodsList());
+            }
+            if(musicGroupPaymentBaseCalender.getCalenderAddress() != null){
+                musicGroupPaymentCalenderAddressService.save(musicGroupPaymentBaseCalender.getCalenderAddress());
+            }
+        }
 
         // 如果是报名,需要修改乐团状态
         if (musicGroupPaymentCalender.getPaymentType() == MUSIC_APPLY) {
@@ -538,6 +545,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         if (calenderMember != null) {
             result.put("memberPrivilegesItemList", memberRankPrivilegesService.queryByMemberRankId(calenderMember.getMemberRankSettingId()));
         }
+        //获取商品采购信息
+        result.put("goods",musicGroupPaymentCalenderGoodsService.lambdaQuery().eq(MusicGroupPaymentCalenderGoods::getCalenderId,calenderId).list());
+        result.put("address",musicGroupPaymentCalenderAddressService.lambdaQuery().eq(MusicGroupPaymentCalenderAddress::getCalenderId,calenderId).one());
         return result;
     }
 
@@ -1020,6 +1030,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
                 musicGroupPaymentCalenderDetailService.batchAdd(calender, calenderStudentDetails);
                 classGroupService.spanGroupClassAdjustPass(adjust.getMasterClassGroupId()
                         , studentIds, courseIds, classGroupStudents, allLockCourseIds, batchNo, adjust.getMasterTotalPrice());
+            } else if (calender.getPaymentType() == GOODS_PURCHASE) {
+                //TODO 推送订单到商城
             }
             for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
                 //将0元未缴费学员缴费状态更新为已缴费
@@ -1362,6 +1374,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         if (musicGroupPaymentCalenderDetailList != null && musicGroupPaymentCalenderDetailList.size() > 0) {
             throw new BizException("操作失败:缴费项目中已存在学员");
         }
+        //TODO 商品采购订单是否已经发货
+
         //如果是学校缴费,删除缴费周期
         musicGroupCalenderRefundPeriodService.deleteByCalenderId(id);
         MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(calender.getBatchNo());
@@ -1399,6 +1413,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         musicGroupPaymentCalenderActivityService.delByCalenderId(id);
         musicGroupPaymentCalenderMemberService.deleteByCalenderId(id);
         musicGroupPaymentCalenderRepairService.deleteByCalenderId(id);
+        musicGroupPaymentCalenderGoodsService.lambdaUpdate().eq(MusicGroupPaymentCalenderGoods::getCalenderId,id).remove();
+        musicGroupPaymentCalenderAddressService.lambdaUpdate().eq(MusicGroupPaymentCalenderAddress::getCalenderId,id).remove();
         List<Long> calenderIds = new ArrayList<Long>();
         calenderIds.add(id);
         musicGroupPaymentCalenderCourseSettingsService.deleteByMusicGroupPaymentCalenderId(calenderIds);

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/GoodsSubMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ym.mec.biz.dal.mapper.GoodsSubMapper">
+
+    <insert id="saveBatch" parameterType="com.ym.mec.biz.dal.entity.GoodsSub">
+        insert into goods_sub(goods_id_, mall_goods_id_, sku_, goods_status_, goods_price_) values
+        <foreach collection="goodsSubs" item="item" open="(" close=")" separator=",">
+            item.goodsId,item.mallGoodsId,item.sku,item.goodsStatus,item.goodsPrice
+        </foreach>
+    </insert>
+</mapper>

+ 6 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/PmsProductQueryParamDto.java

@@ -1,9 +1,15 @@
 package com.ym.mec.common.dto;
 
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 @Data
 public class PmsProductQueryParamDto {
     //skuId多个逗号隔开