Browse Source

Merge branch 'zx_saas_goods' into test

刘俊驰 1 year ago
parent
commit
97777f7e20
100 changed files with 4845 additions and 486 deletions
  1. 2 1
      mec-application/src/main/java/com/ym/mec/teacher/controller/GoodsController.java
  2. 28 4
      mec-application/src/main/java/com/ym/mec/web/controller/APIController.java
  3. 51 6
      mec-application/src/main/java/com/ym/mec/web/controller/GoodsController.java
  4. 12 0
      mec-application/src/main/java/com/ym/mec/web/controller/ImportController.java
  5. 12 0
      mec-application/src/main/java/com/ym/mec/web/controller/MusicGroupCalenderRefundPeriodController.java
  6. 21 0
      mec-application/src/main/resources/columnMapper.ini
  7. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/GoodsDao.java
  8. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupCalenderRefundPeriodDao.java
  9. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderAddressDao.java
  10. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderGoodsDao.java
  11. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java
  12. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ComplementGoodsDto.java
  13. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CooperationCalenderRefundUpdateDto.java
  14. 8 192
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentBaseCalender.java
  15. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Goods.java
  16. 49 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/GoodsSub.java
  17. 8 96
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupCalenderRefundPeriod.java
  18. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java
  19. 69 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderAddress.java
  20. 61 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderGoods.java
  21. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java
  22. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/GoodsSubMapper.java
  23. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsQueryInfo.java
  24. 238 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/GoodsWrapper.java
  25. 33 4
      mec-biz/src/main/java/com/ym/mec/biz/service/GoodsService.java
  26. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupCalenderRefundPeriodService.java
  27. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderAddressService.java
  28. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderGoodsService.java
  29. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  30. 492 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java
  31. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupCalenderRefundPeriodServiceImpl.java
  32. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderAddressServiceImpl.java
  33. 78 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderGoodsServiceImpl.java
  34. 118 23
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  35. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  36. 47 29
      mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml
  37. 19 0
      mec-biz/src/main/resources/config/mybatis/GoodsSubMapper.xml
  38. 15 4
      mec-biz/src/main/resources/config/mybatis/MusicGroupCalenderRefundPeriodMapper.xml
  39. 4 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderAddressMapper.xml
  40. 4 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderGoodsMapper.xml
  41. 6 0
      mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml
  42. 54 0
      mec-client-api/src/main/java/com/ym/mec/mall/MallFeignService.java
  43. 51 0
      mec-client-api/src/main/java/com/ym/mec/mall/fallback/MallFeignServiceFallback.java
  44. 21 1
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  45. 24 1
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  46. 1 1
      mec-common/audit-log/src/main/java/com/yonge/log/interceptor/AuditLogInterceptor.java
  47. 13 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/BrandDto.java
  48. 86 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/OrderCreate.java
  49. 45 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/PmsProductDto.java
  50. 40 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/PmsProductQueryParamDto.java
  51. 12 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/ProductAttributeCategoryDto.java
  52. 15 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/ProductCategoryDto.java
  53. 23 0
      mec-common/common-core/src/main/java/com/ym/mec/common/dto/SchoolDto.java
  54. 13 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/GoodsSubModel.java
  55. 13 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/GoodsSubStockModel.java
  56. 1 1
      mec-common/common-core/src/main/java/com/ym/mec/common/page/PageInfo.java
  57. 4 0
      mec-mall/mall-admin/pom.xml
  58. 2 1
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java
  59. 114 4
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/ExportController.java
  60. 84 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PmsProductSkuStockRecordController.java
  61. 3 2
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PmsSkuStockController.java
  62. 102 6
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java
  63. 8 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/PmsProductDao.java
  64. 23 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/PmsProductSkuStockRecordDao.java
  65. 3 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/PmsSkuStockDao.java
  66. 86 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/OrderCreate.java
  67. 2 55
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/PmsProductQueryParam.java
  68. 8 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderService.java
  69. 3 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsBrandService.java
  70. 3 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductCategoryService.java
  71. 11 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductService.java
  72. 39 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductSkuStockRecordService.java
  73. 5 1
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsSkuStockService.java
  74. 21 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/UmsMemberService.java
  75. 351 19
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java
  76. 16 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsBrandServiceImpl.java
  77. 15 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductCategoryServiceImpl.java
  78. 180 5
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java
  79. 133 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductSkuStockRecordServiceImpl.java
  80. 84 2
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsSkuStockServiceImpl.java
  81. 102 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsMemberServiceImpl.java
  82. 157 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsProductSkuStockRecordWrapper.java
  83. 37 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsProductWrapper.java
  84. 57 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsSkuStockWrapper.java
  85. 12 0
      mec-mall/mall-admin/src/main/resources/bootstrap-dev.properties
  86. 48 3
      mec-mall/mall-admin/src/main/resources/config/mybatis/PmsProductDao.xml
  87. 37 0
      mec-mall/mall-admin/src/main/resources/config/mybatis/PmsProductSkuStockRecordDao.xml
  88. 1 0
      mec-mall/mall-admin/src/main/resources/config/mybatis/PmsSkuStockDao.xml
  89. 25 0
      mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/exception/GlobalExceptionHandler.java
  90. 32 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/dto/PmsSkuStockDto.java
  91. 5 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderItemMapper.java
  92. 3 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderMapper.java
  93. 35 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductSkuStockRecordMapper.java
  94. 2 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsSkuStockMapper.java
  95. 22 1
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrder.java
  96. 66 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsProductSkuStockRecord.java
  97. 872 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsProductSkuStockRecordExample.java
  98. 2 2
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsSkuStock.java
  99. 19 0
      mec-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderItemMapper.xml
  100. 41 3
      mec-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderMapper.xml

+ 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());

+ 28 - 4
mec-application/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -9,7 +9,10 @@ import com.ym.mec.biz.dal.dto.StudentVipGroupShowListDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.impl.GoodsServiceImpl;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.GoodsSubModel;
+import com.ym.mec.common.entity.GoodsSubStockModel;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
@@ -58,6 +61,9 @@ public class APIController extends BaseController {
 	@Autowired
 	private StudentPaymentOrderService studentPaymentOrderService;
 
+	@Autowired
+	private GoodsService goodsService;
+
 	@GetMapping("/createCashAccount")
 	public Boolean createCashAccount(Integer userId,Integer tenantId) {
 		// 添加用户现金账户
@@ -146,24 +152,30 @@ public class APIController extends BaseController {
 	// 商城订单优惠券金额
 	@PostMapping("/couponAmount")
 	public HttpResponseResult<Map> couponAmount(@RequestBody MallCreateOrderModel model) {
-			return succeed(studentPaymentOrderService.couponAmount(model));
+		return succeed(studentPaymentOrderService.couponAmount(model));
 	}
 
 	// 商城保存订单详情数据
 	@PostMapping("/mallSaveOrderInfo")
 	public HttpResponseResult<Map> mallSaveOrderInfo(@RequestBody MallCreateOrderModel model) {
-			studentPaymentOrderService.mallSaveOrderInfo(model);
-			return succeed();
+		studentPaymentOrderService.mallSaveOrderInfo(model);
+		return succeed();
 	}
 
 	// 商城支付成功/失败修改订单状态
 	@PostMapping("/updateOrder")
 	public HttpResponseResult updateOrder(@RequestBody Map map) throws Exception {
-
 		studentPaymentOrderService.updateOrder(map);
 		return succeed();
 	}
 
+	// 同步商城订单发货状态
+	@PostMapping("/updateShippedStatus")
+	public HttpResponseResult updateShippedStatus(@RequestBody List<String> orderNo) throws Exception {
+		studentPaymentOrderService.updateShippedStatus(orderNo);
+		return succeed();
+	}
+
 
 	/**
 	 * 商城取消订单接口
@@ -229,4 +241,16 @@ public class APIController extends BaseController {
 
 		return succeed(balance);
 	}
+
+	// 组合商品状态同步
+	@PostMapping("/goodsStatusSynchronize")
+	public HttpResponseResult<Boolean> goodsStatusSynchronize(@RequestBody List<GoodsSubModel> goodsSubModelList) {
+		return succeed(goodsService.goodsStatusSynchronize(goodsSubModelList));
+	}
+
+	// 组合商品库存同步
+	@PostMapping("/goodsStockCountSynchronize")
+	public HttpResponseResult<Boolean> goodsStockCountSynchronize(@RequestBody List<GoodsSubStockModel> goodsSubStockModels) {
+		return succeed(goodsService.goodsStockCountSynchronize(goodsSubStockModels));
+	}
 }

+ 51 - 6
mec-application/src/main/java/com/ym/mec/web/controller/GoodsController.java

@@ -8,20 +8,30 @@ 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;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.dto.BrandDto;
+import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 @RequestMapping("${app-config.url.web:}/goods")
 @Api(tags = "商品(教材、辅件)服务")
@@ -40,7 +50,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 +89,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());
@@ -111,7 +121,15 @@ public class GoodsController extends BaseController {
         }else if(StringUtils.isEmpty(employee.getOrganIdList())){
             return failed("用户所在分部异常");
         }
-        return succeed(goodsService.queryPage(queryInfo));
+        PageInfo<Goods> page = goodsService.queryPage(queryInfo);
+        List<Goods> rows = page.getRows();
+        if (!rows.isEmpty()) {
+            Map<String, String> brandIdNameMap = goodsService.queryGoodsBrandList().stream().collect(Collectors.toMap(next -> next.getId().toString(), BrandDto::getName));
+            for (Goods row : rows) {
+                row.setBrandName(brandIdNameMap.getOrDefault(row.getBrand(), row.getBrand()));
+            }
+        }
+        return succeed(page);
     }
 
     @ApiOperation(value = "通过科目编号、商品分类 查询商品(教材、辅件)列表")
@@ -120,4 +138,31 @@ 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));
+
+    }
+
+    @ApiOperation(value = "查询商品类型")
+    @GetMapping("/queryGoodsTypeList")
+    public Object queryGoodsTypeList() {
+        return succeed(goodsService.queryGoodsTypeList());
+    }
+
+    @ApiOperation(value = "查询商品分类")
+    @GetMapping("/queryGoodsCategoryList")
+    public Object queryGoodsCategoryList() {
+        return succeed(goodsService.queryGoodsCategoryList());
+    }
+
+    @ApiOperation(value = "查询商品品牌")
+    @GetMapping("/queryGoodsBrandList")
+    public Object queryGoodsBrandList() {
+        return succeed(goodsService.queryGoodsBrandList());
+    }
 }

+ 12 - 0
mec-application/src/main/java/com/ym/mec/web/controller/ImportController.java

@@ -67,6 +67,18 @@ public class ImportController extends BaseController {
         return succeed(goodsService.importGoods(file, sysUserService.getUserId()));
     }
 
+    @ApiOperation(value = "导入商品")
+    @PostMapping(value = "goodsV2")
+//    @PreAuthorize("@pcs.hasPermissions('import/goodsV2')")
+    public HttpResponseResult<String> importGoodsV2(@RequestParam("file") MultipartFile file) throws Exception {
+        String errFile = goodsService.importGoodsV2(file, sysUserService.getUserId());
+        if (StringUtils.isEmpty(errFile)) {
+            return succeed();
+        } else {
+            return failed(errFile);
+        }
+    }
+
     @ApiOperation(value = "导入财务支出")
     @PostMapping(value = "financialExpenditure")
     @PreAuthorize("@pcs.hasPermissions('import/financialExpenditure')")

+ 12 - 0
mec-application/src/main/java/com/ym/mec/web/controller/MusicGroupCalenderRefundPeriodController.java

@@ -1,6 +1,8 @@
 package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.dal.dto.CooperationCalenderRefundDto;
+import com.ym.mec.biz.dal.dto.CooperationCalenderRefundUpdateDto;
+import com.ym.mec.biz.dal.entity.MusicGroupCalenderRefundPeriod;
 import com.ym.mec.biz.dal.page.CooperationRefundQueryInfo;
 import com.ym.mec.biz.service.MusicGroupCalenderRefundPeriodService;
 import com.ym.mec.biz.service.OrganizationService;
@@ -18,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.HashMap;
+import java.util.List;
 
 @RequestMapping("${app-config.url.web:}/musicGroupCalenderRefundPeriod")
 @Api(tags = "学校缴费项目缴费周期")
@@ -49,4 +52,13 @@ public class MusicGroupCalenderRefundPeriodController extends BaseController {
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
         return succeed(musicGroupCalenderRefundPeriodService.queryCoopCalender(queryInfo));
     }
+
+    @ApiOperation(value = "批量修改")
+    @PostMapping("/batchUpdate")
+    @PreAuthorize("@pcs.hasPermissions('musicGroupCalenderRefundPeriod/batchUpdate')")
+    @AuditLogAnnotation(operateName = "批量修改")
+    public HttpResponseResult batchUpdate(@RequestBody List<CooperationCalenderRefundUpdateDto> refundPeriods) {
+        musicGroupCalenderRefundPeriodService.batchUpdate(refundPeriods);
+        return succeed();
+    }
 }

+ 21 - 0
mec-application/src/main/resources/columnMapper.ini

@@ -14,6 +14,27 @@
 商品描述 = brief
 商品详情 = desc
 
+[组合商品导入模板]
+组合商品名称 = name
+组合商品货号 = sn
+组合商品市场价 = marketPrice
+组合商品零售价 = discountPrice
+组合商品团购价 = groupPurchasePrice
+组合商品品牌 = brand
+组合商品类型 = type
+组合商品分类 = goodsCategoryName
+组合商品型号 = specification
+移动端可用分部 = educationShowOrganName
+课程收费团可用分部 = courseFeeShowOrganName
+会员收费乐团可售分部 = memberFeeShowOrganName
+免费乐团可售分部 = freeFeeShowOrganName
+乐器置换可售分部 = replacementShowOrganName
+组合商品描述 = brief
+组合商品详情 = desc
+组合商品图片 = image
+子商品名称 = subGoodsName
+SKU = sku
+子商品成本 = subGoodsPrice
 
 [财务支出导入模板]
 财务流程编号 = financialProcessNo

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/GoodsDao.java

@@ -202,4 +202,8 @@ public interface GoodsDao extends BaseDAO<Integer, Goods> {
     BigDecimal getOrganCostPrice(@Param("complementGoodsIdList") String complementGoodsIdList);
 
     List<Goods> exportGoods(Map<String, Object> params);
+
+    void updateStatus(@Param("goodIdList") List<Integer> goodIdList, @Param("status") Boolean status);
+
+    void updateStock(@Param("goodsList") List<Goods> goodsList);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupCalenderRefundPeriodDao.java

@@ -29,4 +29,6 @@ public interface MusicGroupCalenderRefundPeriodDao extends BaseDAO<Integer, Musi
     void deleteByCalenderId(@Param("calenderId") Long calenderId);
 
     void batchUpdate(@Param("refundPeriods") List<MusicGroupCalenderRefundPeriod> refundPeriods);
+
+    List<MusicGroupCalenderRefundPeriod> queryByIds(@Param("periodsIds") List<Long> periodsIds);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderAddressDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderAddress;
+
+public interface MusicGroupPaymentCalenderAddressDao extends BaseMapper<MusicGroupPaymentCalenderAddress> {
+
+}
+

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderGoodsDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderGoods;
+
+public interface MusicGroupPaymentCalenderGoodsDao extends BaseMapper<MusicGroupPaymentCalenderGoods> {
+
+}
+

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java

@@ -241,4 +241,6 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
     List<Map<Long, String>> getMallProductMap(@Param("productIdList") Set<String> productIdList, @Param("database") String database);
 
     List<String> getMallProductCategory(@Param("database") String database);
+
+    void updateShippedStatus(@Param("orderNos") List<String> orderNos);
 }

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ComplementGoodsDto.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.dal.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ComplementGoodsDto {
+        private Integer skuStockId;
+
+        private Integer goodsId;
+
+        private BigDecimal organCostPrice;
+
+        private String skuCode;
+}

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CooperationCalenderRefundUpdateDto.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class CooperationCalenderRefundUpdateDto {
+
+    @ApiModelProperty(value = "回款周期编号",required = false)
+    private Long id;
+
+    @ApiModelProperty(value = "回款金额",required = false)
+    private BigDecimal refundAmount;
+
+    @ApiModelProperty(value = "修改原因",required = false)
+    private String memo;
+}

+ 8 - 192
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentBaseCalender.java

@@ -4,11 +4,13 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
+@Data
 public class MusicGroupPaymentBaseCalender {
 	@ApiModelProperty(value = "是否继续操作", required = true)
 	private Boolean confirmCreate = false;
@@ -40,6 +42,12 @@ public class MusicGroupPaymentBaseCalender {
 	@ApiModelProperty(value = "批次号", required = false)
 	private String batchNo;
 
+	@ApiModelProperty(value = "商品采购相关信息", required = false)
+	private List<MusicGroupPaymentCalenderGoods> calenderGoodsList;
+
+	@ApiModelProperty(value = "收货地址相关信息", required = false)
+	private MusicGroupPaymentCalenderAddress calenderAddress;
+
 	@ApiModelProperty(value = "会员相关缴费信息", required = false)
 	private MusicGroupPaymentCalenderMember calenderMember;
 
@@ -79,196 +87,4 @@ public class MusicGroupPaymentBaseCalender {
 	@ApiModelProperty(value = "缴费项目名称", required = false)
 	private String name;
 
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String getContractUrl() {
-		return contractUrl;
-	}
-
-	public void setContractUrl(String contractUrl) {
-		this.contractUrl = contractUrl;
-	}
-
-	public BigDecimal getCurrentTotalAmount() {
-		return currentTotalAmount;
-	}
-
-	public void setCurrentTotalAmount(BigDecimal currentTotalAmount) {
-		this.currentTotalAmount = currentTotalAmount;
-	}
-
-	public List<MusicGroupCalenderRefundPeriod> getMusicGroupCalenderRefundPeriods() {
-		return musicGroupCalenderRefundPeriods;
-	}
-
-	public void setMusicGroupCalenderRefundPeriods(List<MusicGroupCalenderRefundPeriod> musicGroupCalenderRefundPeriods) {
-		this.musicGroupCalenderRefundPeriods = musicGroupCalenderRefundPeriods;
-	}
-
-	public String getCalenderFeeJson() {
-		return calenderFeeJson;
-	}
-
-	public void setCalenderFeeJson(String calenderFeeJson) {
-		this.calenderFeeJson = calenderFeeJson;
-	}
-
-	public String getCalenderFeeType() {
-		return calenderFeeType;
-	}
-
-	public void setCalenderFeeType(String calenderFeeType) {
-		this.calenderFeeType = calenderFeeType;
-	}
-
-	public Boolean getConfirmCreate() {
-		return confirmCreate;
-	}
-
-	public void setConfirmCreate(Boolean confirmCreate) {
-		this.confirmCreate = confirmCreate;
-	}
-
-	public Long getCalenderId() {
-		return calenderId;
-	}
-
-	public void setCalenderId(Long calenderId) {
-		this.calenderId = calenderId;
-	}
-
-	public CalenderAddStudent getCalenderAddStudent() {
-		return calenderAddStudent;
-	}
-
-	public void setCalenderAddStudent(CalenderAddStudent calenderAddStudent) {
-		this.calenderAddStudent = calenderAddStudent;
-	}
-
-	public List<MusicGroupPaymentCalenderActivity> getCalenderActivityList() {
-		return calenderActivityList;
-	}
-
-	public void setCalenderActivityList(List<MusicGroupPaymentCalenderActivity> calenderActivityList) {
-		this.calenderActivityList = calenderActivityList;
-	}
-
-	public MusicGroupPaymentCalenderRepair getMusicRepair() {
-		return musicRepair;
-	}
-
-	public void setMusicRepair(MusicGroupPaymentCalenderRepair musicRepair) {
-		this.musicRepair = musicRepair;
-	}
-
-	public MusicGroup getMusicGroup() {
-		return musicGroup;
-	}
-
-	public void setMusicGroup(MusicGroup musicGroup) {
-		this.musicGroup = musicGroup;
-	}
-
-	public Date getStartPaymentDate() {
-		return startPaymentDate;
-	}
-
-	public void setStartPaymentDate(Date startPaymentDate) {
-		this.startPaymentDate = startPaymentDate;
-	}
-
-	public Date getDeadlinePaymentDate() {
-		return deadlinePaymentDate;
-	}
-
-	public void setDeadlinePaymentDate(Date deadlinePaymentDate) {
-		this.deadlinePaymentDate = deadlinePaymentDate;
-	}
-
-	public MusicGroupPaymentCalenderMember getCalenderMember() {
-		return calenderMember;
-	}
-
-	public void setCalenderMember(MusicGroupPaymentCalenderMember calenderMember) {
-		this.calenderMember = calenderMember;
-	}
-
-	public String getMusicGroupId() {
-		return musicGroupId;
-	}
-
-	public void setMusicGroupId(String musicGroupId) {
-		this.musicGroupId = musicGroupId;
-	}
-
-	public Integer getMusicGroupOrganizationCourseSettingId() {
-		return musicGroupOrganizationCourseSettingId;
-	}
-
-	public void setMusicGroupOrganizationCourseSettingId(Integer musicGroupOrganizationCourseSettingId) {
-		this.musicGroupOrganizationCourseSettingId = musicGroupOrganizationCourseSettingId;
-	}
-
-	public PayUserType getPayUserType() {
-		return payUserType;
-	}
-
-	public void setPayUserType(PayUserType payUserType) {
-		this.payUserType = payUserType;
-	}
-
-	public PaymentType getPaymentType() {
-		return paymentType;
-	}
-
-	public void setPaymentType(PaymentType paymentType) {
-		this.paymentType = paymentType;
-	}
-
-	public String getMemo() {
-		return memo;
-	}
-
-	public void setMemo(String memo) {
-		this.memo = memo;
-	}
-
-	public List<MusicGroupPaymentCalenderCourseSettings> getMusicGroupPaymentCalenderCourseSettingsList() {
-		return musicGroupPaymentCalenderCourseSettingsList;
-	}
-
-	public void setMusicGroupPaymentCalenderCourseSettingsList(List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingsList) {
-		this.musicGroupPaymentCalenderCourseSettingsList = musicGroupPaymentCalenderCourseSettingsList;
-	}
-
-	public String getBatchNo() {
-		return batchNo;
-	}
-
-	public void setBatchNo(String batchNo) {
-		this.batchNo = batchNo;
-	}
-
-	public String getPaymentItemShowState() {
-		return paymentItemShowState;
-	}
-
-	public void setPaymentItemShowState(String paymentItemShowState) {
-		this.paymentItemShowState = paymentItemShowState;
-	}
-
-	public Boolean getIsShowSalePrice() {
-		return isShowSalePrice;
-	}
-
-	public void setIsShowSalePrice(Boolean isShowSalePrice) {
-		this.isShowSalePrice = isShowSalePrice;
-	}
-
 }

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Goods.java

@@ -114,6 +114,10 @@ public class Goods {
 	@ApiModelProperty(value = "附件商品列表编号(用逗号分开)",required = false)
 	private String complementGoodsIdList;
 
+	/** 发布时间 */
+	@ApiModelProperty(value = "附件商品详情",required = false)
+	private String complementGoodsJson;
+
 	/** 辅件列表 */
 	@ApiModelProperty(value = "辅件列表(子商品)",required = false)
 	private List<Goods> goodsList;
@@ -185,6 +189,8 @@ public class Goods {
 
 	private String childOrganCostPrice;
 
+	private String brandName;
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 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;
+
+}

+ 8 - 96
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupCalenderRefundPeriod.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
@@ -9,6 +10,7 @@ import java.math.BigDecimal;
 /**
  * 对应数据库表(music_group_calender_refund_period):
  */
+@Data
 public class MusicGroupCalenderRefundPeriod {
 
 	/**  */
@@ -40,6 +42,12 @@ public class MusicGroupCalenderRefundPeriod {
 
 	@ApiModelProperty(value = "订单编号",required = false)
 	private String orderNos;
+
+	@ApiModelProperty(value = "备注",required = false)
+	private String memo;
+
+	@ApiModelProperty(value = "责任人",required = false)
+	private Integer responsiblePerson;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -47,102 +55,6 @@ public class MusicGroupCalenderRefundPeriod {
 	/**  */
 	private java.util.Date updateTime;
 
-	public String getOrderNos() {
-		return orderNos;
-	}
-
-	public void setOrderNos(String orderNos) {
-		this.orderNos = orderNos;
-	}
-
-	public BigDecimal getIncome() {
-		return income;
-	}
-
-	public void setIncome(BigDecimal income) {
-		this.income = income;
-	}
-
-	public Boolean getRefundFlag() {
-		return refundFlag;
-	}
-
-	public void setRefundFlag(Boolean refundFlag) {
-		this.refundFlag = refundFlag;
-	}
-
-	public void setId(Integer id){
-		this.id = id;
-	}
-	
-	public Integer getId(){
-		return this.id;
-	}
-			
-	public void setOrganId(Integer organId){
-		this.organId = organId;
-	}
-	
-	public Integer getOrganId(){
-		return this.organId;
-	}
-			
-	public void setCooperationOrganId(Integer cooperationOrganId){
-		this.cooperationOrganId = cooperationOrganId;
-	}
-	
-	public Integer getCooperationOrganId(){
-		return this.cooperationOrganId;
-	}
-			
-	public void setCalenderId(Long calenderId){
-		this.calenderId = calenderId;
-	}
-	
-	public Long getCalenderId(){
-		return this.calenderId;
-	}
-			
-	public void setRefundDate(String refundDate){
-		this.refundDate = refundDate;
-	}
-	
-	public String getRefundDate(){
-		return this.refundDate;
-	}
-			
-	public void setRefundAmount(java.math.BigDecimal refundAmount){
-		this.refundAmount = refundAmount;
-	}
-	
-	public java.math.BigDecimal getRefundAmount(){
-		return this.refundAmount;
-	}
-			
-	public void setSubRefundAmount(java.math.BigDecimal subRefundAmount){
-		this.subRefundAmount = subRefundAmount;
-	}
-	
-	public java.math.BigDecimal getSubRefundAmount(){
-		return this.subRefundAmount;
-	}
-			
-	public void setCreateTime(java.util.Date createTime){
-		this.createTime = createTime;
-	}
-	
-	public java.util.Date getCreateTime(){
-		return this.createTime;
-	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
-		this.updateTime = updateTime;
-	}
-	
-	public java.util.Date getUpdateTime(){
-		return this.updateTime;
-	}
-			
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java

@@ -76,7 +76,7 @@ public class MusicGroupPaymentCalender extends BaseEntity {
 
 	public enum PaymentType implements BaseEnum<String, PaymentType> {
 		ADD_STUDENT("新增学员"), ADD_COURSE("临时加课"), MUSIC_APPLY("乐团报名"),
-		MUSIC_RENEW("乐团续费"),SPAN_GROUP_CLASS_ADJUST("跨团班级调整");
+		MUSIC_RENEW("乐团续费"),SPAN_GROUP_CLASS_ADJUST("跨团班级调整"),GOODS_PURCHASE("商品采购");
 
 		private String desc;
 

+ 69 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderAddress.java

@@ -0,0 +1,69 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@ApiModel(value = "music_group_payment_calender_address")
+@Data
+public class MusicGroupPaymentCalenderAddress implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @TableField("calender_id_")
+    @ApiModelProperty(value = "缴费项目编号")
+    private Long calenderId;
+
+    @TableField("order_no_")
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+    @TableField("delivery_flag_")
+    @ApiModelProperty("是否发货")
+    private Boolean deliveryFlag = false;
+
+    @TableField("name_")
+    @ApiModelProperty(value = "收货人")
+    private String name;
+
+    @TableField("phone_")
+    @ApiModelProperty(value = "收货人手机号")
+    private String phone;
+
+    @TableField("province_")
+    @ApiModelProperty(value = "省")
+    private String province;
+
+    @TableField("city_")
+    @ApiModelProperty(value = "市")
+    private String city;
+
+    @TableField("region_")
+    @ApiModelProperty(value = "区")
+    private String region;
+
+    @TableField("post_code_")
+    @ApiModelProperty(value = "邮编")
+    private String postCode;
+
+    @TableField("address_")
+    @ApiModelProperty(value = "详细地址")
+    private String address;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+}
+

+ 61 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderGoods.java

@@ -0,0 +1,61 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@ApiModel(value = "music_group_payment_calender_goods")
+@Data
+public class MusicGroupPaymentCalenderGoods implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @TableField("calender_id_")
+    @ApiModelProperty(value = "缴费项目编号")
+    private Long calenderId;
+
+    @TableField("goods_id_")
+    @ApiModelProperty(value = "商品编号")
+    private Integer goodsId;
+
+    @TableField("goods_name_")
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @TableField("goods_sn_")
+    @ApiModelProperty(value = "商品货号")
+    private String goodsSn;
+
+    @TableField("child_goods_json_")
+    @ApiModelProperty(value = "子商品明细")
+    private String childGoodsJson;
+
+    @TableField("num_")
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @TableField("single_price_")
+    @ApiModelProperty(value = "单价")
+    private java.math.BigDecimal singlePrice;
+
+    @TableField("total_price_")
+    @ApiModelProperty(value = "总价")
+    private java.math.BigDecimal totalPrice;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+}
+

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java

@@ -4,6 +4,7 @@ import com.ym.mec.common.enums.BaseEnum;
 
 public enum TemplateTypeEnum implements BaseEnum<String, TemplateTypeEnum> {
     GOODS("GOODS","商品导入模板"),
+    GOODS_GROUP("GOODS_GROUP","组合商品导入模板"),
     ROUTE_ORDER("ROUTE_ORDER","财务管理导入模板"),
     FINANCIAL_EXPENDITURE("FINANCIAL_EXPENDITURE","财务支出导入模板"),
     REDEMPTIONCODE("REDEMPTION_CODE", "兑换码分配模板表"),

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

@@ -0,0 +1,21 @@
+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);
+
+    void updateStatus(@Param("goodsSubIdList") List<Integer> goodsSubIdList, @Param("status") Boolean status);
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsQueryInfo.java

@@ -52,6 +52,9 @@ public class GoodsQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "此参数为1则不按分部查询")
     private Integer noOrganSearch;
 
+    @ApiModelProperty(value = "品牌ID")
+    private String brandId;
+
     private Integer subjectId;
 
     public Integer getNoOrganSearch() {
@@ -173,4 +176,12 @@ public class GoodsQueryInfo extends QueryInfo {
 	public void setFreeFeeShowOrganId(String freeFeeShowOrganId) {
 		this.freeFeeShowOrganId = freeFeeShowOrganId;
 	}
+
+    public String getBrandId() {
+        return brandId;
+    }
+
+    public void setBrandId(String brandId) {
+        this.brandId = brandId;
+    }
 }

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

@@ -0,0 +1,238 @@
+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.Date;
+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 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("商城商品名称")
+        private String mallGoodsName;
+
+        @ApiModelProperty("sku编号")
+        private Integer sku;
+
+        @ApiModelProperty("销售价格")
+        private BigDecimal price;
+
+        @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;
+
+    }
+
+}

+ 33 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/GoodsService.java

@@ -3,6 +3,12 @@ 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.BrandDto;
+import com.ym.mec.common.dto.PmsProductDto;
+import com.ym.mec.common.dto.ProductCategoryDto;
+import com.ym.mec.common.entity.GoodsSubModel;
+import com.ym.mec.common.entity.GoodsSubStockModel;
 import com.ym.mec.common.page.PageInfo;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -18,7 +24,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);
 
@@ -74,6 +80,15 @@ public interface GoodsService extends BaseService<Integer, Goods> {
     List<Goods> importGoods(MultipartFile file, Integer operatorId) throws Exception;
 
     /**
+     * 导入组合商品
+     * @param file 文件
+     * @param userId 导入人信息
+     * @return 失败时的回执文件路径
+     */
+    String importGoodsV2(MultipartFile file, Integer userId) throws Exception;
+
+
+    /**
      * @describe 库存预警
      * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
      * @author zouxuan
@@ -126,9 +141,23 @@ 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);
+
+    Boolean goodsStatusSynchronize(List<GoodsSubModel> goodsSubModelList);
+
+    Boolean goodsStockCountSynchronize(List<GoodsSubStockModel> goodsSubStockModels);
+
+    List<ProductCategoryDto> queryGoodsTypeList();
+
+    List<BrandDto> queryGoodsBrandList();
+
+    Object queryGoodsCategoryList();
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupCalenderRefundPeriodService.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CooperationCalenderRefundDto;
+import com.ym.mec.biz.dal.dto.CooperationCalenderRefundUpdateDto;
 import com.ym.mec.biz.dal.dto.CooperationRefundDto;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentBaseCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupCalenderRefundPeriod;
@@ -35,4 +36,6 @@ public interface MusicGroupCalenderRefundPeriodService extends BaseService<Integ
     * @date 2022/10/19 11:20
     */
     Boolean calcRefundAmount(Long calenderId,String orderNo, BigDecimal amount);
+
+    void batchUpdate(List<CooperationCalenderRefundUpdateDto> refundPeriods);
 }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderAddressService.java

@@ -0,0 +1,13 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderAddressDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderGoodsDao;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderAddress;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderGoods;
+
+public interface MusicGroupPaymentCalenderAddressService extends IService<MusicGroupPaymentCalenderAddress> {
+
+    MusicGroupPaymentCalenderAddressDao getDao();
+}
+

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderGoodsService.java

@@ -0,0 +1,14 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderGoodsDao;
+import com.ym.mec.biz.dal.dto.MusicGroupPaymentBaseCalender;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderGoods;
+
+import java.math.BigDecimal;
+
+public interface MusicGroupPaymentCalenderGoodsService extends IService<MusicGroupPaymentCalenderGoods> {
+
+    MusicGroupPaymentCalenderGoodsDao getDao();
+}
+

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -274,4 +274,7 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
     BigDecimal balance(Long userId);
 
     List<OperatingTotalIncomeDto> queryOperatingSummaryIncome(Map<String, Object> params);
+
+    //商品已发货
+    void updateShippedStatus(List<String> orderNo);
 }

+ 492 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java

@@ -2,32 +2,64 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.biz.dal.dao.*;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.ym.mec.biz.dal.dao.GoodsDao;
+import com.ym.mec.biz.dal.dao.GoodsProcurementDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.SellOrderDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.GoodsSellDto;
+import com.ym.mec.biz.dal.dto.SubjectGoodsDto;
 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.enums.AccountType;
+import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.SellStatus;
+import com.ym.mec.biz.dal.enums.StockType;
+import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.mapper.GoodsSubMapper;
+import com.ym.mec.biz.dal.page.GoodsCategoryQueryInfo;
 import com.ym.mec.biz.dal.page.GoodsQuery;
 import com.ym.mec.biz.dal.page.GoodsQueryInfo;
-import com.ym.mec.biz.service.*;
+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.SysConfigService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysTenantConfigService;
+import com.ym.mec.biz.service.UploadFileService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.dto.BrandDto;
+import com.ym.mec.common.dto.PmsProductDto;
+import com.ym.mec.common.dto.PmsProductQueryParamDto;
+import com.ym.mec.common.dto.ProductCategoryDto;
+import com.ym.mec.common.entity.GoodsSubModel;
+import com.ym.mec.common.entity.GoodsSubStockModel;
 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;
+import com.ym.mec.mall.MallFeignService;
 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 lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.math.NumberUtils;
 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;
@@ -36,17 +68,20 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implements GoodsService {
 	private static final Logger LOGGER = LoggerFactory.getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
-	
+
 	@Autowired
 	private GoodsDao goodsDao;
 	@Autowired
@@ -65,7 +100,14 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	private SellOrderDao sellOrderDao;
 	@Autowired
 	private OrganizationDao organizationDao;
+	@Resource
+	private MallFeignService mallFeignService;
+
+	@Autowired
+	private GoodsSubMapper goodsSubMapper;
 
+	@Autowired
+	private GoodsCategoryService goodsCategoryService;
 	@Override
 	public BaseDAO<Integer, Goods> getDAO() {
 		return goodsDao;
@@ -154,24 +196,41 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	}
 
 	@Override
-	@Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
-	public void addGoods(Goods goods, Integer operatorId) {
+	@Transactional(rollbackFor = Exception.class)
+	public void addGoods(GoodsWrapper.Goods goods, Integer operatorId) {
 		if(StringUtils.isBlank(goods.getSn())){
 			throw new BizException("请指定商品货号");
 		}
 		Goods existsGood = goodsDao.lockBySn(goods.getSn());
 		if(Objects.nonNull(existsGood)){
 			throw new BizException("商品货号重复");
-		}else{
-			if(Objects.isNull(goods.getStockCount())){
-				goods.setStockCount(0);
-			}
-			if(Objects.isNull(goods.getTaxStockCount())){
-				goods.setTaxStockCount(0);
-			}
-			goods.setSellCount(0);
-			goodsDao.insert(goods);
 		}
+		List<GoodsWrapper.GoodsSub> goodsSubList = goods.getGoodsSubList();
+		//获取最小的库存数
+		String skuIds = goodsSubList.stream().map(e -> e.getSku().toString()).collect(Collectors.joining(","));
+		PmsProductQueryParamDto paramDto = new PmsProductQueryParamDto();
+		paramDto.setSkuStockIds(skuIds);
+//		paramDto.setPublishStatus(1);
+		paramDto.setPageSize(1000);
+		paramDto.setPageNum(1);
+		paramDto.setJson(JSON.toJSONString(paramDto));
+		List<PmsProductDto> productList = mallFeignService.getProductList(paramDto).getRows();
+		if(CollectionUtils.isEmpty(productList)){
+			throw new BizException("子商品不存在");
+		}
+		//获取最小库存数量
+		Integer stock = productList.stream().map(PmsProductDto::getStock).min(Integer::compareTo).get();
+		goods.setStockCount(stock);
+		goods.setSellCount(0);
+		Goods goodsRecord = new Goods();
+		BeanUtils.copyProperties(goods,goodsRecord);
+		goodsRecord.setStatus(YesOrNoEnum.NO);
+		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
@@ -227,6 +286,13 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 					throw new BizException("{}等商品还在销售中", goodsNames);
 				}
 			}
+			List<GoodsWrapper.GoodsSub> goodsSubs = queryGoodsSub(goodsId);
+			if (!CollectionUtils.isEmpty(goodsSubs) && status == 1) {
+				long falseSize = goodsSubs.stream().map(GoodsWrapper.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());
@@ -241,6 +307,47 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		goodsDao.update(goods);
 	}
 
+	private List<GoodsWrapper.GoodsSub> queryGoodsSub(Integer goodsId) {
+		// 从管乐迷商城组合的商品
+		QueryWrapper<GoodsSub> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("goods_id_", goodsId);
+		List<GoodsSub> goodsSubs = goodsSubMapper.selectList(queryWrapper);
+		if (goodsSubs.isEmpty()) {
+			return new ArrayList<>();
+		}
+		List<String> skuList = goodsSubs.stream().map(next -> next.getSku().toString()).distinct().collect(Collectors.toList());
+		List<GoodsWrapper.GoodsSub> goodsSubList = goodsSubs.stream().map(next -> {
+			GoodsWrapper.GoodsSub goodsSub = new GoodsWrapper.GoodsSub();
+			goodsSub.setId(next.getId());
+			goodsSub.setGoodsId(goodsId);
+			goodsSub.setMallGoodsId(next.getMallGoodsId());
+			goodsSub.setGoodsStatus(next.getGoodsStatus());
+			goodsSub.setSku(next.getSku());
+			goodsSub.setGoodsPrice(next.getGoodsPrice());
+			return goodsSub;
+		}).collect(Collectors.toList());
+		PmsProductQueryParamDto build = PmsProductQueryParamDto.builder()
+				.skuStockIds(String.join(",", skuList))
+				.pageSize(9999)
+				.pageNum(1).build();
+		build.setJson(JSON.toJSONString(build));
+		Map<Integer, PmsProductDto> map = mallFeignService.getProductList(build)
+				.getRows().stream().collect(Collectors.toMap(PmsProductDto::getSkuStockId, Function.identity()));
+		goodsSubList.forEach(next -> {
+			PmsProductDto dto = map.get(next.getSku());
+			if (dto != null) {
+				next.setPrice(dto.getPrice());
+				if (1 == dto.getDeleteStatus()) {
+					next.setGoodsStatus(false);
+				} else {
+					next.setGoodsStatus(dto.getPublishStatus() == 1);
+				}
+				next.setMallGoodsName(dto.getName());
+			}
+		});
+		return goodsSubList;
+	}
+
 	@Override
 	public List<Goods> findGoodsBySubId(GoodsQuery goodsQuery) {
 		return goodsDao.findGoodsBySubId(goodsQuery);
@@ -460,6 +567,241 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		return goodsList;
 	}
 
+
+	@Transactional(rollbackFor = Exception.class)
+	@Override
+	public String importGoodsV2(MultipartFile file, Integer userId) throws Exception {
+		List<String> errList = new ArrayList<>();
+		Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
+		if (sheetsListMap.values().isEmpty()) {
+			errList.add("excel未解析到数据");
+			return "";
+		}
+
+		// 查询商品分类
+		GoodsCategoryQueryInfo goodsCategoryQueryInfo = new GoodsCategoryQueryInfo();
+		goodsCategoryQueryInfo.setDelFlag(YesOrNoEnum.NO);
+		goodsCategoryQueryInfo.setPage(1);
+		goodsCategoryQueryInfo.setRows(9999);
+		Map<String, Integer> categoryIdNameMap = goodsCategoryService.querySubjectGoods(goodsCategoryQueryInfo).getRows()
+				.stream().collect(Collectors.toMap(SubjectGoodsDto::getGoodsCategoryName, SubjectGoodsDto::getGoodsCategoryId));
+		Set<String> categoryNames = categoryIdNameMap.keySet();
+
+		// 查询员工机构
+		Map<String, Integer> orgNameIdMap = organizationDao.findAllOrgans(TenantContextHolder.getTenantId()).stream()
+				.collect(Collectors.toMap(Organization::getName, Organization::getId));
+
+
+		InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
+		Map<String, String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.GOODS_GROUP.getMsg());
+
+		List<Map<String, Object>> firstSheet = sheetsListMap.get(0);
+		List<String> skuList = firstSheet.stream().map(next -> next.get("SKU").toString()).distinct().collect(Collectors.toList());
+
+		List<PmsProductDto> subGoods = new ArrayList<>();
+		try {
+			// 查询SKU对应商品
+			PmsProductQueryParamDto dto = PmsProductQueryParamDto.builder()
+					.skuStockIds(String.join(",", skuList))
+					.pageNum(1)
+					.pageSize(9999)
+					.build();
+			dto.setJson(JSON.toJSONString(dto));
+			subGoods.addAll(mallFeignService.getProductList(dto).getRows());
+		} catch (Exception e) {
+			errList.add("商城服务调用失败");
+		}
+		Map<String, PmsProductDto>skuMap = subGoods.stream().collect(Collectors.toMap(next -> (next.getName() + "_" + next.getSkuCode()), Function.identity()));
+
+		List<GoodsWrapper.Goods> goodsList = new ArrayList<>();
+		for (Map.Entry<String, List<Map<String, Object>>> sheetData : sheetsListMap.entrySet()) {
+			List<Map<String, Object>> rows = sheetData.getValue();
+			if (rows.isEmpty()) {
+				continue;
+			}
+			Map<String, Object> firstRow = rows.get(0);
+			// 缺省字段
+			Set<String> templateFields = columns.keySet();
+			List<String> defaultField = templateFields.stream().filter(firstRow::containsKey).collect(Collectors.toList());
+			if (!defaultField.isEmpty()) {
+				errList.add("导入字段缺省:" + String.join(",", defaultField));
+				break;
+			}
+
+			String lineErrMsg = "第%s行存在错误:%s";
+			Map<String, String> beforeGoods = new HashMap<>();
+
+			JSONObject objectMap = new JSONObject();
+			String subGoodsName = null;
+			String subGoodsSku = null;
+			for (int i = 0; i < rows.size(); i++) {
+				int rowNum = i + 2;
+				GoodsWrapper.Goods goods = new GoodsWrapper.Goods();
+				GoodsWrapper.GoodsSub goodsSub = new GoodsWrapper.GoodsSub();
+				Map<String, Object> row = rows.get(i);
+				if (row.size() == 0) {
+					continue;
+				}
+				for (Map.Entry<String, Object> entry : row.entrySet()) {
+					String fieldName = entry.getKey();
+					if (!templateFields.contains(fieldName)) {
+						continue;
+					}
+					String fieldCode = columns.get(fieldName);
+					String value = entry.getValue().toString();
+
+					// 非子商品字段为空,往上一行获取值
+					if (StringUtils.isEmpty(value)) {
+						if ("subGoodsName".equals(fieldCode) || "sku".equals(fieldCode) || "subGoodsPrice".equals(fieldCode)) {
+							errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’为空"));
+						} else {
+							if (!beforeGoods.containsKey(fieldCode)) {
+								errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’为空"));
+								continue;
+							} else {
+								value = beforeGoods.get(fieldCode);
+							}
+						}
+					} else {
+						beforeGoods.put(fieldCode, value);
+					}
+					if ("marketPrice".equals(fieldCode)
+							|| "discountPrice".equals(fieldCode)
+							|| "groupPurchasePrice".equals(fieldCode)) {
+						if (NumberUtils.isNumber(value)) {
+							BigDecimal prize = new BigDecimal(value);
+							if (BigDecimal.ZERO.compareTo(prize) > 0) {
+								errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’不能为负数"));
+							} else {
+								objectMap.put(fieldCode, value);
+							}
+						} else {
+							errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’类型错误"));
+						}
+					} else if ("type".equals(fieldCode)) {
+						String tempValue = value;
+						boolean match = Arrays.stream(GoodsType.values()).allMatch(next -> next.getDesc().equals(tempValue));
+						if (match) {
+							objectMap.put(fieldCode, value);
+						} else {
+							errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’类型不支持"));
+						}
+					} else if ("goodsCategoryName".equals(fieldCode)) {
+						if(categoryNames.contains(value)){
+							objectMap.put("goodsCategoryId", categoryIdNameMap.get(value));
+						}else {
+							errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’类型不支持"));
+						}
+					} else if ("educationShowOrganName".equals(fieldCode)
+							|| "courseFeeShowOrganName".equals(fieldCode)
+							|| "memberFeeShowOrganName".equals(fieldCode)
+							|| "freeFeeShowOrganName".equals(fieldCode)
+							|| "replacementShowOrganName".equals(fieldCode)
+					) {
+						List<String> orgIds = new ArrayList<>();
+						for (String orgName : value.split(",")) {
+							if (!orgNameIdMap.containsKey(orgName)) {
+								errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’:‘" + value + "’分部不支持"));
+							} else {
+								orgIds.add(orgNameIdMap.get(orgName).toString());
+							}
+						}
+						String join = String.join(",", orgIds);
+						String fieldKey = fieldCode.replaceAll("Name", "Id");
+						objectMap.put(fieldKey, join);
+//						if("educationShowOrganName".equals(fieldCode)){
+//							goods.setEducationShowOrganId(join);
+//						}else if("courseFeeShowOrganName".equals(fieldCode)){
+//							goods.setCourseFeeShowOrganId(join);
+//						}else if("memberFeeShowOrganName".equals(fieldCode)){
+//							goods.setMemberFeeShowOrganId(join);
+//						}else if("freeFeeShowOrganName".equals(fieldCode)){
+//							goods.setFreeFeeShowOrganId(join);
+//						}else if("replacementShowOrganName".equals(fieldCode)){
+//							goods.setReplacementShowOrganId(join);
+//						}
+					} else if ("subGoodsName".equals(fieldCode)) {
+						subGoodsName = value;
+						if (StringUtils.isNotEmpty(subGoodsSku)) {
+							String key = subGoodsName + "_" + subGoodsSku;
+							if (skuMap.containsKey(key)) {
+								PmsProductDto dto = skuMap.get(key);
+								objectMap.put("mallGoodsId", dto.getGoodsId().intValue());
+								objectMap.put("sku", dto.getSkuStockId());
+								objectMap.put("stock", dto.getStock());
+								objectMap.put("goodsStatus", dto.getPublishStatus()==1);
+							} else {
+								errList.add(String.format(lineErrMsg, rowNum, "子商品‘" + value + "[" + subGoodsSku + "]’不存在"));
+							}
+						}
+					} else if ("sku".equals(fieldCode)) {
+						subGoodsSku = value;
+						if (StringUtils.isNotEmpty(subGoodsName)) {
+							String key = subGoodsName + "_" + subGoodsSku;
+							if (skuMap.containsKey(key)) {
+								PmsProductDto dto = skuMap.get(key);
+								objectMap.put("mallGoodsId", dto.getGoodsId().intValue());
+								objectMap.put("sku", dto.getSkuStockId());
+								objectMap.put("stock", dto.getStock());
+								objectMap.put("goodsStatus", dto.getPublishStatus()==1);
+							} else {
+								errList.add(String.format(lineErrMsg, rowNum, "子商品‘" + value + "[" + subGoodsSku + "]’不存在"));
+							}
+						}
+					} else if ("subGoodsPrice".equals(fieldCode)) {
+						BigDecimal subGoodsPrice = new BigDecimal(value);
+						if (BigDecimal.ZERO.compareTo(subGoodsPrice) > 0) {
+							errList.add(String.format(lineErrMsg, rowNum, "字段‘" + fieldName + "’不能为负数"));
+						}
+						goodsSub.setGoodsPrice(subGoodsPrice);
+					} else {
+						objectMap.put(fieldCode, value);
+					}
+				}
+				goods.setGoodsSubList(Collections.singletonList(goodsSub));
+				goodsList.add(goods);
+			}
+		}
+
+		if (goodsList.isEmpty()) {
+			errList.add("未解析到数据");
+		}
+
+		if (!errList.isEmpty()) {
+			// 存在错误信息,添加错误日志文件返回
+			return "";
+		}
+
+		Map<String, List<GoodsWrapper.Goods>> goodsGroup = goodsList.stream().collect(Collectors.groupingBy(next -> next.getName() + "_" + next.getSn()));
+
+
+		// 数据合并
+		Map<Integer, Integer> skuIdMap = subGoods.stream().collect(Collectors.toMap(PmsProductDto::getSkuStockId, PmsProductDto::getStock));
+
+		goodsGroup.forEach((key, value) -> {
+			GoodsWrapper.Goods good = value.get(0);
+			List<GoodsWrapper.GoodsSub> goodsSubList = value.stream().map(GoodsWrapper.Goods::getGoodsSubList).flatMap(Collection::stream).collect(Collectors.toList());
+			Integer stock = goodsSubList.stream().map(next -> skuIdMap.get(next.getSku())).min(Integer::compareTo).orElse(0);
+
+			Goods goods = JSON.parseObject(JSON.toJSONString(good), Goods.class);
+			goods.setStatus(YesOrNoEnum.NO);
+			goods.setStockCount(stock);
+			this.insert(goods);
+
+			List<GoodsSub> subList = goodsSubList.stream().map(next -> {
+				GoodsSub sub = new GoodsSub();
+				sub.setGoodsId(goods.getId());
+				sub.setMallGoodsId(next.getMallGoodsId());
+				sub.setSku(next.getSku());
+				sub.setGoodsStatus(next.getGoodsStatus());
+				sub.setGoodsPrice(next.getGoodsPrice());
+				return sub;
+			}).collect(Collectors.toList());
+			goodsSubMapper.saveBatch(subList);
+		});
+		return null;
+	}
+
 	@Override
 	public void repertoryWarn(Integer tenantId) {
 		//预警手机号
@@ -711,7 +1053,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()),","));
@@ -731,7 +1073,10 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		if(StringUtils.isNotEmpty(goods.getFreeFeeShowOrganId())){
 			goods.setFreeFeeShowOrganName(StringUtils.join(organizationDao.findByOrganIds(goods.getFreeFeeShowOrganId()),","));
 		}
-		return goods;
+		GoodsWrapper.Goods detail = new GoodsWrapper.Goods();
+		BeanUtils.copyProperties(goods, detail);
+		detail.setGoodsSubList(queryGoodsSub(goodsId));
+		return detail;
 	}
 
 	@Override
@@ -744,4 +1089,133 @@ 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();
+		dto.setJson(JSON.toJSONString(dto));
+		return mallFeignService.getProductList(dto);
+	}
+
+	@Transactional
+	@Override
+	public Boolean goodsStatusSynchronize(List<GoodsSubModel> goodsSubModelList) {
+		if (CollectionUtils.isEmpty(goodsSubModelList)) {
+			return false;
+		}
+		log.info(Thread.currentThread().getName() + "开始同步商品状态:" + JSON.toJSONString(goodsSubModelList));
+		List<Integer> goodIds = goodsSubModelList.stream().map(GoodsSubModel::getMallGoodsId).distinct().collect(Collectors.toList());
+		QueryWrapper<GoodsSub> queryWrapper = new QueryWrapper<>();
+		queryWrapper.in("mall_goods_id_", goodIds);
+		List<GoodsSub> goodsSubs = goodsSubMapper.selectList(queryWrapper);
+		if (CollectionUtils.isEmpty(goodsSubs)) {
+			return true;
+		}
+		Map<Integer, Boolean> keyStatusMap = goodsSubModelList.stream().collect(Collectors.toMap(GoodsSubModel::getMallGoodsId, GoodsSubModel::getGoodsStatus));
+		log.info(Thread.currentThread().getName() + "开始同步商品状态:0/" + goodsSubs.size());
+		List<GoodsSub> goodsSubList = goodsSubs.stream().peek(next -> next.setGoodsStatus(keyStatusMap.get(next.getMallGoodsId()))).collect(Collectors.toList());
+		// 下架的商品
+		List<GoodsSub> downGoods = goodsSubList.stream().filter(next -> Boolean.FALSE.equals(next.getGoodsStatus())).collect(Collectors.toList());
+		if(!CollectionUtils.isEmpty(downGoods)){
+			List<Integer> goodIdList = downGoods.stream().map(GoodsSub::getGoodsId).distinct().collect(Collectors.toList());
+			goodsDao.updateStatus(goodIdList, false);
+		}
+		Map<Boolean, List<Integer>> listMap = goodsSubList.stream().collect(Collectors.groupingBy(GoodsSub::getGoodsStatus, Collectors.mapping(GoodsSub::getId, Collectors.toList())));
+		listMap.forEach((key, values) -> goodsSubMapper.updateStatus(values, key));
+		log.info(Thread.currentThread().getName() + "同步商品状态完成");
+		return true;
+	}
+
+	/**
+	 * 同步组合商品库存
+	 * @param goodsSubStockModels 商品库存信息
+	 * @return true/false
+	 */
+	@Transactional(rollbackFor = Exception.class)
+	@Override
+	public Boolean goodsStockCountSynchronize(List<GoodsSubStockModel> goodsSubStockModels) {
+		if(goodsSubStockModels.isEmpty()){
+			return false;
+		}
+		List<Integer> skus = goodsSubStockModels.stream().map(GoodsSubStockModel::getSku).distinct().collect(Collectors.toList());
+
+		QueryWrapper<GoodsSub> queryWrapper = new QueryWrapper<>();
+		queryWrapper.in("sku_", skus);
+		List<GoodsSub> goodsSubs = goodsSubMapper.selectList(queryWrapper);
+		if (CollectionUtils.isEmpty(goodsSubs)) {
+			return true;
+		}
+		Map<Integer, Integer> stockMap = goodsSubStockModels.stream().collect(Collectors.toMap(GoodsSubStockModel::getSku, GoodsSubStockModel::getStock));
+		List<Integer> goodIds = goodsSubs.stream().map(GoodsSub::getGoodsId).distinct().collect(Collectors.toList());
+		goodsDao.lockGoods(goodIds);
+		List<Goods> goodsList = goodsDao.findGoodsByIds(goodIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
+		Map<Integer, Integer> goodStockMap = goodsList.stream().collect(Collectors.toMap(Goods::getId, Goods::getStockCount));
+
+		List<Goods> updateGoods = new ArrayList<>();
+		for (GoodsSub goodsSub : goodsSubs) {
+			Integer goodsId = goodsSub.getGoodsId();
+			Integer stock = stockMap.get(goodsSub.getSku());
+			int updateStock = Math.min(goodStockMap.get(goodsId), stock);
+
+			Goods goods = new Goods();
+			goods.setId(goodsId);
+			goods.setStockCount(updateStock);
+			updateGoods.add(goods);
+		}
+		goodsDao.updateStock(updateGoods);
+		return true;
+	}
+
+	@Override
+	public List<ProductCategoryDto> queryGoodsTypeList() {
+		return mallFeignService.listWithChildren();
+	}
+
+	@Override
+	public List<BrandDto> queryGoodsBrandList() {
+		return mallFeignService.getList();
+	}
+
+	@Override
+	public Object queryGoodsCategoryList() {
+		return mallFeignService.getProductAttributeCategoryList();
+	}
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupCalenderRefundPeriodServiceImpl.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dao.MusicGroupCalenderRefundPeriodDao;
 import com.ym.mec.biz.dal.dao.MusicGroupDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.CooperationCalenderRefundDto;
+import com.ym.mec.biz.dal.dto.CooperationCalenderRefundUpdateDto;
 import com.ym.mec.biz.dal.dto.CooperationRefundDto;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentBaseCalender;
 import com.ym.mec.biz.dal.entity.MusicGroup;
@@ -188,4 +189,24 @@ public class MusicGroupCalenderRefundPeriodServiceImpl extends BaseServiceImpl<I
         }
         return false;
     }
+
+    @Override
+    public void batchUpdate(List<CooperationCalenderRefundUpdateDto> refundPeriods) {
+        List<Long> periodsIds = refundPeriods.stream().map(e -> e.getId()).collect(Collectors.toList());
+        List<MusicGroupCalenderRefundPeriod> periods = musicGroupCalenderRefundPeriodDao.queryByIds(periodsIds);
+        Map<Long, CooperationCalenderRefundUpdateDto> periodMap = refundPeriods.stream().collect(Collectors.toMap(e -> e.getId(), e -> e));
+        periods.forEach(e->{
+            CooperationCalenderRefundUpdateDto dto = periodMap.get(e.getId());
+            e.setRefundAmount(dto.getRefundAmount());
+            e.setMemo(dto.getMemo());
+            if (e.getRefundAmount().compareTo(e.getIncome()) <= 0) {
+                e.setSubRefundAmount(BigDecimal.ZERO);
+                e.setRefundFlag(true);
+            } else {
+                e.setSubRefundAmount(e.getRefundAmount().subtract(e.getIncome()));
+                e.setRefundFlag(false);
+            }
+        });
+        musicGroupCalenderRefundPeriodDao.batchUpdate(periods);
+    }
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderAddressServiceImpl.java

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderAddressDao;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderAddress;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderAddressService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service("musicGroupPaymentCalenderAddressService")
+public class MusicGroupPaymentCalenderAddressServiceImpl extends ServiceImpl<MusicGroupPaymentCalenderAddressDao, MusicGroupPaymentCalenderAddress> implements MusicGroupPaymentCalenderAddressService {
+
+    private final static Logger log = LoggerFactory.getLogger(MusicGroupPaymentCalenderAddressServiceImpl.class);
+
+    @Override
+    public MusicGroupPaymentCalenderAddressDao getDao() {
+        return this.baseMapper;
+    }
+
+}
+

+ 78 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderGoodsServiceImpl.java

@@ -0,0 +1,78 @@
+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.*;
+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;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service("musicGroupPaymentCalenderGoodsService")
+public class MusicGroupPaymentCalenderGoodsServiceImpl extends ServiceImpl<MusicGroupPaymentCalenderGoodsDao, MusicGroupPaymentCalenderGoods>
+        implements MusicGroupPaymentCalenderGoodsService, MusicGroupPaymentCalenderBaseService<MusicGroupPaymentCalenderGoods> {
+
+    private final static Logger log = LoggerFactory.getLogger(MusicGroupPaymentCalenderGoodsServiceImpl.class);
+
+    @Override
+    public MusicGroupPaymentCalenderGoodsDao getDao() {
+        return this.baseMapper;
+    }
+
+    private GoodsDao goodsDao;
+
+    @Override
+    public MusicGroupPaymentCalender.PaymentCalenderStatusEnum checkComponentAmount(MusicGroupPaymentBaseCalender baseCalender) {
+        return null;
+    }
+
+    @Override
+    public BigDecimal getActualAmount(MusicGroupPaymentBaseCalender baseCalender) {
+        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> 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 getOriginalAmount(baseCalender);
+    }
+
+    @Override
+    public <E> E initBean(E bean) {
+        return null;
+    }
+
+}
+

+ 118 - 23
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.*;
@@ -20,30 +19,26 @@ import com.ym.mec.biz.event.source.SendSeoMessageSource;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.dto.OrderCreate;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.WrapperUtil;
 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.math.RoundingMode;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
@@ -112,6 +107,10 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
     @Autowired
+    private MusicGroupPaymentCalenderAddressService musicGroupPaymentCalenderAddressService;
+    @Autowired
+    private MusicGroupPaymentCalenderGoodsServiceImpl musicGroupPaymentCalenderGoodsService;
+    @Autowired
     private MusicGroupPaymentCalenderActivityServiceImpl musicGroupPaymentCalenderActivityService;
     @Autowired
     private MusicGroupPaymentCalenderMemberServiceImpl musicGroupPaymentCalenderMemberService;
@@ -260,23 +259,28 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         CalenderAddStudent calenderAddStudent = musicGroupPaymentBaseCalender.getCalenderAddStudent();
         MusicGroupPaymentCalender musicGroupPaymentCalender = new MusicGroupPaymentCalender();
         BeanUtils.copyProperties(musicGroupPaymentBaseCalender,musicGroupPaymentCalender);
-        //判断缴费项目类型
-        if (musicGroup.getStatus() == MusicGroupStatusEnum.DRAFT || musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT_FAILED || musicGroup.getStatus() == MusicGroupStatusEnum.FEE_AUDIT_FAILED) {
-            musicGroupPaymentCalender.setPaymentType(MUSIC_APPLY);
-        } else {
-            if (calenderAddStudent != null && calenderAddStudent.getStudentIds() != null) {
-                musicGroupPaymentCalender.setPaymentType(ADD_STUDENT);
-                //预计缴费人数
-                musicGroupPaymentCalender.setAttribute1(calenderAddStudent.getClassGroupIds());
-                musicGroupPaymentCalender.setStudentIds(calenderAddStudent.getStudentIds().toString());
-                musicGroupPaymentCalender.setExpectNum(1);
-                //校验是否可以加学员
-                checkAddStudent(calenderAddStudent, musicGroup);
+        if(musicGroupPaymentBaseCalender.getCalenderGoodsList() != null){
+            musicGroupPaymentCalender.setPaymentType(GOODS_PURCHASE);
+            musicGroupPaymentCalender.setPayUserType(SCHOOL);
+        }else {
+            //判断缴费项目类型
+            if (musicGroup.getStatus() == MusicGroupStatusEnum.DRAFT || musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT_FAILED || musicGroup.getStatus() == MusicGroupStatusEnum.FEE_AUDIT_FAILED) {
+                musicGroupPaymentCalender.setPaymentType(MUSIC_APPLY);
             } else {
-                if (musicGroupPaymentBaseCalender.getMusicGroupOrganizationCourseSettingId() != null) {
-                    musicGroupPaymentCalender.setPaymentType(MUSIC_RENEW);
+                if (calenderAddStudent != null && calenderAddStudent.getStudentIds() != null) {
+                    musicGroupPaymentCalender.setPaymentType(ADD_STUDENT);
+                    //预计缴费人数
+                    musicGroupPaymentCalender.setAttribute1(calenderAddStudent.getClassGroupIds());
+                    musicGroupPaymentCalender.setStudentIds(calenderAddStudent.getStudentIds().toString());
+                    musicGroupPaymentCalender.setExpectNum(1);
+                    //校验是否可以加学员
+                    checkAddStudent(calenderAddStudent, musicGroup);
                 } else {
-                    musicGroupPaymentCalender.setPaymentType(ADD_COURSE);
+                    if (musicGroupPaymentBaseCalender.getMusicGroupOrganizationCourseSettingId() != null) {
+                        musicGroupPaymentCalender.setPaymentType(MUSIC_RENEW);
+                    } else {
+                        musicGroupPaymentCalender.setPaymentType(ADD_COURSE);
+                    }
                 }
             }
         }
@@ -287,9 +291,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         BigDecimal memberOriginalAmount = musicGroupPaymentCalenderMemberService.getOriginalAmount(musicGroupPaymentBaseCalender);
         BigDecimal repairOriginalAmount = musicGroupPaymentCalenderRepairService.getOriginalAmount(musicGroupPaymentBaseCalender);
         BigDecimal activityOriginalAmount = musicGroupPaymentCalenderActivityService.getOriginalAmount(musicGroupPaymentBaseCalender);
+        BigDecimal goodsOriginalAmount = musicGroupPaymentCalenderGoodsService.getOriginalAmount(musicGroupPaymentBaseCalender);
 
         BigDecimal originalTotalAmount = courseOriginalAmount.add(memberOriginalAmount)
                 .add(activityOriginalAmount)
+                .add(goodsOriginalAmount)
                 .add(repairOriginalAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
 
         //计算缴费项目总金额(前端录入)
@@ -297,9 +303,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         BigDecimal memberActualAmount = musicGroupPaymentCalenderMemberService.getActualAmount(musicGroupPaymentBaseCalender);
         BigDecimal repairActualAmount = musicGroupPaymentCalenderRepairService.getActualAmount(musicGroupPaymentBaseCalender);
         BigDecimal activityActualAmount = musicGroupPaymentCalenderActivityService.getActualAmount(musicGroupPaymentBaseCalender);
+        BigDecimal goodsActualAmount = musicGroupPaymentCalenderGoodsService.getActualAmount(musicGroupPaymentBaseCalender);
 
         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){
@@ -341,7 +349,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;
@@ -425,6 +435,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) {
@@ -529,6 +548,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;
     }
 
@@ -1011,6 +1033,66 @@ 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 推送订单到商城
+                MusicGroupPaymentCalenderAddress address = musicGroupPaymentCalenderAddressService.lambdaQuery()
+                        .eq(MusicGroupPaymentCalenderAddress::getCalenderId, calender.getId()).one();
+                if (address == null) {
+                    throw new BizException("收货地址不存在");
+                }
+                //获取商品信息
+                List<MusicGroupPaymentCalenderGoods> goods = musicGroupPaymentCalenderGoodsService.lambdaQuery()
+                        .eq(MusicGroupPaymentCalenderGoods::getCalenderId, calender.getId()).list();
+                if (CollectionUtils.isEmpty(goods)) {
+                    throw new BizException("商品信息不存在");
+                }
+                OrderCreate orderCreate = new OrderCreate();
+                String orderNo = idGeneratorService.generatorId("payment") + "";
+                address.setOrderNo(orderNo);
+                musicGroupPaymentCalenderAddressService.updateById(address);
+                orderCreate.setOrderNo(orderNo);
+                orderCreate.setOrchestraId(musicGroup.getId());
+                orderCreate.setMemberId(musicGroup.getSchoolId().longValue());
+                orderCreate.setTotalAmount(calender.getCurrentTotalAmount());
+                orderCreate.setOrderFormType("MEC");
+                orderCreate.setPlatformType("SCHOOL");
+                orderCreate.setSourceType(2);
+                orderCreate.setReceiverName(address.getName());
+                orderCreate.setReceiverPostCode(address.getPostCode());
+                orderCreate.setReceiverPhone(address.getPhone());
+                orderCreate.setReceiverProvince(address.getProvince());
+                orderCreate.setReceiverCity(address.getCity());
+                orderCreate.setReceiverRegion(address.getRegion());
+                orderCreate.setReceiverDetailAddress(address.getAddress());
+                orderCreate.setStatus(1);
+                List<OrderCreate.OrderItem> orderItems = new ArrayList<>();
+                for (MusicGroupPaymentCalenderGoods e : goods) {
+                    BigDecimal totalPrice = e.getTotalPrice();
+                    List<ComplementGoodsDto> goodsDtoList = JSON.parseArray(e.getChildGoodsJson(), ComplementGoodsDto.class);
+                    //总金额按比例分配
+                    //待分配
+                    BigDecimal waitRemitFee = totalPrice;
+                    BigDecimal totalAmount = WrapperUtil.sumList(goodsDtoList, ComplementGoodsDto::getOrganCostPrice);
+                    for (int i = 0; i < goodsDtoList.size(); i++) {
+                        ComplementGoodsDto goodsDto = goodsDtoList.get(i);
+                        OrderCreate.OrderItem orderItemCreate = new OrderCreate.OrderItem();
+                        orderItemCreate.setProductQuantity(1);
+                        orderItemCreate.setProductSkuId(goodsDto.getSkuStockId().longValue());
+                        //如果是最后一件商品
+                        if (i == goodsDtoList.size() - 1) {
+                            orderItemCreate.setRealAmount(waitRemitFee);
+                        } else {
+                            //获取比例
+                            BigDecimal ratioAmount = goodsDto.getOrganCostPrice().divide(totalAmount, 6, RoundingMode.HALF_UP);
+                            //获取分配的金额
+                            BigDecimal multiply = ratioAmount.multiply(totalPrice).setScale(2, RoundingMode.HALF_UP);
+                            orderItemCreate.setRealAmount(multiply);
+                            waitRemitFee = waitRemitFee.subtract(multiply);
+                        }
+                        orderItems.add(orderItemCreate);
+                    }
+                }
+                orderCreate.setOrderItemList(orderItems);
             }
             for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
                 //将0元未缴费学员缴费状态更新为已缴费
@@ -1353,6 +1435,19 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         if (musicGroupPaymentCalenderDetailList != null && musicGroupPaymentCalenderDetailList.size() > 0) {
             throw new BizException("操作失败:缴费项目中已存在学员");
         }
+        //商品采购订单
+        if(calender.getPaymentType() == GOODS_PURCHASE){
+            //TODO 商品采购订单是否已经发货
+            MusicGroupPaymentCalenderAddress address = musicGroupPaymentCalenderAddressService.lambdaQuery().eq(MusicGroupPaymentCalenderAddress::getCalenderId, id).one();
+            if(address != null){
+                if (address.getDeliveryFlag()) {
+                    throw new BizException("操作失败:商品采购订单已发货");
+                }
+                musicGroupPaymentCalenderAddressService.removeById(address.getId());
+            }
+            musicGroupPaymentCalenderGoodsService.lambdaUpdate().eq(MusicGroupPaymentCalenderGoods::getCalenderId,id).remove();
+        }
+
         //如果是学校缴费,删除缴费周期
         musicGroupCalenderRefundPeriodService.deleteByCalenderId(id);
         MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(calender.getBatchNo());

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -2201,6 +2201,11 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         return incomeDtos;
     }
 
+    @Override
+    public void updateShippedStatus(List<String> orderNo) {
+        sellOrderDao.updateShippedStatus(orderNo);
+    }
+
     public BigDecimal getActualAmount(BigDecimal price, StudentPaymentOrderExportDto row) {
         if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
             return price.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);

+ 47 - 29
mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml

@@ -58,34 +58,34 @@
 
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="Goods" useCache="false" flushCache="true">
-		SELECT * FROM goods g
-		WHERE g.id_ = #{id}
-	</select>
+        SELECT * FROM goods g
+        WHERE g.id_ = #{id}
+    </select>
 
     <select id="lock" resultMap="Goods" useCache="false" flushCache="true">
-		SELECT * FROM goods WHERE id_ = #{goodsId} LOCK IN SHARE MODE
-	</select>
+        SELECT * FROM goods WHERE id_ = #{goodsId} LOCK IN SHARE MODE
+    </select>
 
     <!-- 全查询 -->
     <select id="findAll" resultMap="Goods">
-		SELECT * FROM goods where tenant_id_ = #{tenantId} ORDER BY id_
-	</select>
+        SELECT * FROM goods where tenant_id_ = #{tenantId} ORDER BY id_
+    </select>
 
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.Goods" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
         INSERT INTO goods
         (goods_category_id_,sn_,name_,brand_,specification_,image_,stock_count_,tax_stock_count_,sell_count_,market_price_,
-        discount_price_,group_purchase_price_,brief_,desc_,is_new_,is_top_,status_,memo_,publish_time_,
-        complement_goods_id_list_,update_time_,create_time_,type_,agree_cost_price_,stock_warning_,stock_type_
+         discount_price_,group_purchase_price_,brief_,desc_,is_new_,is_top_,status_,memo_,publish_time_,
+         complement_goods_id_list_,update_time_,create_time_,type_,agree_cost_price_,stock_warning_,stock_type_
             ,student_show_organ_id_,education_show_organ_id_,replacement_show_organ_id_,course_fee_show_organ_id_,
          member_fee_show_organ_id_,free_fee_show_organ_id_,tenant_id_,organ_cost_price_)
         VALUES(#{goodsCategoryId},#{sn},#{name},#{brand},#{specification},#{image},#{stockCount},#{taxStockCount},#{sellCount},#{marketPrice},
-        #{discountPrice},#{groupPurchasePrice},#{brief},#{desc},
-        #{isNew,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isTop,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{memo},#{publishTime},#{complementGoodsIdList},now(),now(),#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{agreeCostPrice},
-        #{stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{studentShowOrganId},#{educationShowOrganId},#{replacementShowOrganId},#{courseFeeShowOrganId},
+               #{discountPrice},#{groupPurchasePrice},#{brief},#{desc},
+               #{isNew,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isTop,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+               #{memo},#{publishTime},#{complementGoodsIdList},now(),now(),#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{agreeCostPrice},
+               #{stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+               #{studentShowOrganId},#{educationShowOrganId},#{replacementShowOrganId},#{courseFeeShowOrganId},
                #{memberFeeShowOrganId},#{freeFeeShowOrganId},#{tenantId},#{organCostPrice})
     </insert>
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
@@ -94,7 +94,7 @@
         discount_price_,group_purchase_price_,brief_,desc_,update_time_,create_time_,type_,agree_cost_price_,sn_,
         stock_count_,tax_stock_count_,stock_warning_,stock_type_
         ,student_show_organ_id_,education_show_organ_id_,replacement_show_organ_id_,course_fee_show_organ_id_,
-         member_fee_show_organ_id_,free_fee_show_organ_id_,tenant_id_,organ_cost_price_)
+        member_fee_show_organ_id_,free_fee_show_organ_id_,tenant_id_,organ_cost_price_)
         VALUES
         <foreach collection="list" separator="," item="goods">
             (#{goods.goodsCategoryId},#{goods.name},#{goods.brand},#{goods.specification},#{goods.image},#{goods.marketPrice},
@@ -104,7 +104,7 @@
             #{goods.stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{goods.stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{goods.studentShowOrganId},#{goods.educationShowOrganId},#{goods.replacementShowOrganId},
-             #{goods.courseFeeShowOrganId},#{goods.memberFeeShowOrganId},#{goods.freeFeeShowOrganId},#{goods.tenantId},#{goods.organCostPrice}
+            #{goods.courseFeeShowOrganId},#{goods.memberFeeShowOrganId},#{goods.freeFeeShowOrganId},#{goods.tenantId},#{goods.organCostPrice}
             )
         </foreach>
     </insert>
@@ -112,12 +112,12 @@
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.Goods">
         UPDATE goods
         <set>
-                student_show_organ_id_ = #{studentShowOrganId},
-                education_show_organ_id_ = #{educationShowOrganId},
-                replacement_show_organ_id_ = #{replacementShowOrganId},
-                course_fee_show_organ_id_ = #{courseFeeShowOrganId},
-                member_fee_show_organ_id_ = #{memberFeeShowOrganId},
-                free_fee_show_organ_id_ = #{freeFeeShowOrganId},
+            student_show_organ_id_ = #{studentShowOrganId},
+            education_show_organ_id_ = #{educationShowOrganId},
+            replacement_show_organ_id_ = #{replacementShowOrganId},
+            course_fee_show_organ_id_ = #{courseFeeShowOrganId},
+            member_fee_show_organ_id_ = #{memberFeeShowOrganId},
+            free_fee_show_organ_id_ = #{freeFeeShowOrganId},
             <if test="agreeCostPrice != null">
                 agree_cost_price_ = #{agreeCostPrice},
             </if>
@@ -193,7 +193,7 @@
             <if test="stockType != null">
                 stock_type_ = #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
-                update_time_ = NOW()
+            update_time_ = NOW()
         </set>
         WHERE id_ = #{id} and tenant_id_ = #{tenantId}
     </update>
@@ -295,7 +295,7 @@
                 <if test="goods.stockType != null">
                     stock_type_ = #{goods.stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 </if>
-                    update_time_ = NOW()
+                update_time_ = NOW()
             </set>
             WHERE id_ = #{goods.id} and tenant_id_ = #{goods.tenantId}
         </foreach>
@@ -303,8 +303,8 @@
 
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">
-		DELETE FROM goods WHERE id_ = #{id}
-	</delete>
+        DELETE FROM goods WHERE id_ = #{id}
+    </delete>
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="Goods" parameterType="map">
@@ -323,7 +323,7 @@
 
     <sql id="queryGoodsPageSql">
         <where>
-        	g.tenant_id_ = #{tenantId}
+            g.tenant_id_ = #{tenantId}
             <if test="goodsCategoryId != null">
                 AND g.goods_category_id_ = #{goodsCategoryId}
             </if>
@@ -363,6 +363,9 @@
             <if test="replacementShowOrganId!=null and replacementShowOrganId!=''">
                 AND INTE_ARRAY(#{replacementShowOrganId},g.replacement_show_organ_id_)
             </if>
+            <if test="brandId != null and brandId != ''">
+                AND g.brand_ = #{brandId}
+            </if>
             <if test="noOrganSearch == null">
                 <if test="organId != null and organId != ''">
                     AND INTE_ARRAY (#{organId},CONCAT_WS(',',
@@ -388,7 +391,7 @@
 
     <sql id="queryOrganIdSql">
         <where>
-                AND g.status_ != 0 and g.tenant_id_ = #{goodsQuery.tenantId}
+            AND g.status_ != 0 and g.tenant_id_ = #{goodsQuery.tenantId}
             <if test="goodsQuery.subjectId != null">
                 AND sgm.subject_id_ = #{goodsQuery.subjectId}
             </if>
@@ -515,7 +518,7 @@
 
     <select id="getGoodsInfo" resultMap="Goods">
         SELECT g.*,gc.name_ goods_category_name_ FROM goods g
-        LEFT JOIN goods_category gc on g.goods_category_id_ = gc.id_
+                                                          LEFT JOIN goods_category gc on g.goods_category_id_ = gc.id_
         WHERE g.id_=#{id}
     </select>
 
@@ -585,4 +588,19 @@
             </if>
         </where>
     </sql>
+
+    <update id="updateStatus">
+        update goods set status_= #{status}
+        where id_ in
+        <foreach collection="goodIdList" separator="," open="(" close=")" item="item">
+            #{item}
+        </foreach>
+    </update>
+
+    <update id="updateStock">
+        <foreach collection="goodsList" item="goods" separator=";">
+        UPDATE goods set stock_count_ = #{goods.stockCount}
+            where id_ = #{goods.id}
+        </foreach>
+    </update>
 </mapper>

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

@@ -0,0 +1,19 @@
+<?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" separator=",">
+            (#{item.goodsId},#{item.mallGoodsId},#{item.sku},#{item.goodsStatus},#{item.goodsPrice})
+        </foreach>
+    </insert>
+
+    <update id="updateStatus">
+        update goods_sub set goods_status_ = #{status}
+        where id_ in
+        <foreach collection="goodsSubIdList" separator="," open="(" close=")" item="item">
+            #{item}
+        </foreach>
+    </update>
+</mapper>

+ 15 - 4
mec-biz/src/main/resources/config/mybatis/MusicGroupCalenderRefundPeriodMapper.xml

@@ -30,6 +30,9 @@
 			<if test="bean.subRefundAmount != null">
 				sub_refund_amount_ = #{bean.subRefundAmount},
 			</if>
+			<if test="bean.refundAmount != null">
+				refund_amount_ = #{bean.refundAmount},
+			</if>
 			<if test="bean.income != null">
 				income_ = #{bean.income},
 			</if>
@@ -52,16 +55,18 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupCalenderRefundPeriod" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO music_group_calender_refund_period (organ_id_,cooperation_organ_id_,calender_id_,
-		                                                refund_date_,refund_amount_,sub_refund_amount_,income_,refund_flag_,order_nos_,create_time_,update_time_)
-		VALUES(#{organId},#{cooperationOrganId},#{calenderId},#{refundDate},#{refundAmount},#{subRefundAmount},#{income},#{refundFlag},#{orderNos},NOW(),NOW())
+		                                                refund_date_,refund_amount_,sub_refund_amount_,income_,refund_flag_,order_nos_,responsible_person_,create_time_,update_time_)
+		VALUES(#{organId},#{cooperationOrganId},#{calenderId},#{refundDate},#{refundAmount},#{subRefundAmount},#{income},#{refundFlag},#{orderNos},#{responsiblePerson},NOW(),NOW())
 	</insert>
 	<insert id="batchInsert">
 		INSERT INTO music_group_calender_refund_period (organ_id_,cooperation_organ_id_,calender_id_,
-														refund_date_,refund_amount_,sub_refund_amount_,income_,refund_flag_,order_nos_,create_time_,update_time_)
+														refund_date_,refund_amount_,sub_refund_amount_,income_,refund_flag_,
+		                                                order_nos_,responsible_person_,create_time_,update_time_)
 		VALUES
 		<foreach collection="refundPeriods" separator="," item="bean">
 			(#{bean.organId},#{bean.cooperationOrganId},#{bean.calenderId},#{bean.refundDate},
-			 #{bean.refundAmount},#{bean.subRefundAmount},#{bean.income},#{bean.refundFlag},#{bean.orderNos},#{bean.createTime},#{bean.updateTime})
+			 #{bean.refundAmount},#{bean.subRefundAmount},#{bean.income},#{bean.refundFlag},#{bean.orderNos},
+			 #{bean.responsiblePerson},#{bean.createTime},#{bean.updateTime})
 		</foreach>
 	</insert>
 
@@ -206,4 +211,10 @@
 		left join music_group_payment_calender mgpc ON mgpc.id_ = crp.calender_id_
 		<include refid="queryCoopRefundSql"/>
 	</select>
+	<select id="queryByIds" resultMap="MusicGroupCalenderRefundPeriod">
+		SELECT * FROM music_group_calender_refund_period WHERE id_ IN
+		<foreach collection="periodsIds" item="id" open="(" close=")" separator=",">
+			#{id}
+		</foreach>
+	</select>
 </mapper>

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderAddressMapper.xml

@@ -0,0 +1,4 @@
+<?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.dao.MusicGroupPaymentCalenderAddressDao">
+</mapper>

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderGoodsMapper.xml

@@ -0,0 +1,4 @@
+<?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.dao.MusicGroupPaymentCalenderGoodsDao">
+</mapper>

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml

@@ -268,6 +268,12 @@
             where id_ = #{sellOrder.id} and tenant_id_ = #{sellOrder.tenantId}
         </foreach>
     </update>
+    <update id="updateShippedStatus">
+        update sell_order SET delivery_time_ = NOW() where order_no_
+        <foreach collection="orderNos" item="orderNo" open="(" close=")" separator=",">
+            #{orderNo}
+        </foreach>
+    </update>
 
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
         insert into sell_order (organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_, expect_amount_,

+ 54 - 0
mec-client-api/src/main/java/com/ym/mec/mall/MallFeignService.java

@@ -0,0 +1,54 @@
+package com.ym.mec.mall;
+
+import com.baomidou.mybatisplus.extension.api.R;
+import com.baomidou.mybatisplus.extension.enums.ApiErrorCode;
+import com.ym.mec.common.config.FeignConfiguration;
+import com.ym.mec.common.dto.*;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.mall.fallback.MallFeignServiceFallback;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@FeignClient(name = "${app-config.open-feign.mall-server.name:mall-server}",
+		contextId = "MallFeignService",
+		url = "${app-config.open-feign.mall-server.url:}",
+		configuration = FeignConfiguration.class, fallback = MallFeignServiceFallback.class)
+public interface MallFeignService {
+
+	@PostMapping(value = "open/product/list")
+	@ResponseBody
+	PageInfo<PmsProductDto> getProductList(@RequestBody PmsProductQueryParamDto productQueryParam);
+
+
+    // 同步完成订单
+    @PostMapping(value = "/open/product/orderCreate", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    boolean productOrderCreate(@RequestBody OrderCreate order) ;
+
+    // 同步订单状态,
+    /**
+     * 查询商品订单状态
+     * @param orderNo 订单编号
+     * @return status 订单状态  0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
+     */
+    @GetMapping(value = "/open/product/updateOrderStatus", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    boolean productUpdateOrderStatus(@RequestParam("orderNo") String orderNo,@RequestParam("status") Integer status);
+
+
+    //根据品牌名称分页获取品牌列表
+    @RequestMapping(value = "/open/brand/list", method = RequestMethod.GET)
+    List<BrandDto> getList();
+
+
+    // 查询所有一级分类及子分类
+    @RequestMapping(value = "/open/productCategory/list/withChildren", method = RequestMethod.GET)
+    @ResponseBody
+    List<ProductCategoryDto> listWithChildren();
+
+
+//    @ApiOperation("分页获取所有商品属性分类")
+    @RequestMapping(value = "/open/productAttribute/category/list", method = RequestMethod.GET)
+    List<ProductAttributeCategoryDto> getProductAttributeCategoryList();
+}

+ 51 - 0
mec-client-api/src/main/java/com/ym/mec/mall/fallback/MallFeignServiceFallback.java

@@ -0,0 +1,51 @@
+package com.ym.mec.mall.fallback;
+
+import com.ym.mec.common.dto.*;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.mall.MallFeignService;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class MallFeignServiceFallback implements MallFeignService {
+
+
+    @Override
+    public PageInfo<PmsProductDto> getProductList(PmsProductQueryParamDto productQueryParam) {
+        return null;
+    }
+
+    @Override
+    public boolean productOrderCreate(OrderCreate order) {
+        return false;
+    }
+
+    /**
+     * 查询商品订单状态
+     *
+     * @param orderNo 订单编号
+     * @param status 订单状态
+     */
+    @Override
+    public boolean productUpdateOrderStatus(String orderNo, Integer status) {
+        return false;
+    }
+
+    @Override
+    public List<BrandDto> getList() {
+        return null;
+    }
+
+    @Override
+    public List<ProductCategoryDto> listWithChildren() {
+        return null;
+    }
+
+    @Override
+    public List<ProductAttributeCategoryDto> getProductAttributeCategoryList() {
+        return null;
+    }
+
+
+}

+ 21 - 1
mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java

@@ -1,6 +1,9 @@
 package com.ym.mec.web;
 
 import com.ym.mec.common.config.FeignConfiguration;
+import com.ym.mec.common.dto.SchoolDto;
+import com.ym.mec.common.entity.GoodsSubModel;
+import com.ym.mec.common.entity.GoodsSubStockModel;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
@@ -41,7 +44,7 @@ public interface WebFeignService {
 	String getTenantConfigValue(@RequestParam("tenantId") Integer tenantId, @RequestParam("paramName") String paramName);
 
 	@PostMapping(value = "api/queryVipPracticeGroups")
-    Boolean queryVipPracticeGroups();
+	Boolean queryVipPracticeGroups();
 
 	@GetMapping(value = "/hfMerchantConfig/queryByTenantId")
 	HttpResponseResult<HfMerchantConfig> queryByTenantId(@RequestParam("payerName") String payerName,@RequestParam("id") Integer id);
@@ -55,6 +58,10 @@ public interface WebFeignService {
 	@PostMapping("/api/updateOrder")
 	HttpResponseResult updateOrder(@RequestBody Map map);
 
+	//商城发货状态同步
+	@PostMapping("/api/updateShippedStatus")
+	HttpResponseResult updateShippedStatus(@RequestBody List<String> orderNo);
+
 	@PostMapping("/api/cancelOrder")
 	HttpResponseResult<OrderCancelModel> cancelOrder(@RequestParam("orderNo") String orderNo,@RequestParam("reason") String reason);
 
@@ -82,4 +89,17 @@ public interface WebFeignService {
 	// 商城获取 收货状态
 	@PostMapping("/api/balance")
 	HttpResponseResult<BigDecimal> balance(@RequestParam("userId") Long userId);
+
+	// 商城商品状态更新,同步商品状态
+	@PostMapping("/api/goodsStatusSynchronize")
+	HttpResponseResult<Boolean> goodsStatusSynchronize(@RequestBody List<GoodsSubModel> goodsSubModelList);
+
+	// 商城商品库存更新,同步商品库存
+	@PostMapping("/api/goodsStockCountSynchronize")
+	HttpResponseResult<Boolean> goodsStockCountSynchronize(@RequestBody List<GoodsSubStockModel> goodsSubStockModels);
+
+
+    // 商城商品库存更新,同步商品库存
+    @PostMapping("/api/schoolListByIds")
+    HttpResponseResult<List<SchoolDto>> schoolListByIds(List<Long> schoolIds);
 }

+ 24 - 1
mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java

@@ -1,5 +1,8 @@
 package com.ym.mec.web.fallback;
 
+import com.ym.mec.common.dto.SchoolDto;
+import com.ym.mec.common.entity.GoodsSubModel;
+import com.ym.mec.common.entity.GoodsSubStockModel;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
@@ -74,7 +77,12 @@ public class WebFeignServiceFallback implements WebFeignService {
 		return null;
 	}
 
-	@Override
+    @Override
+    public HttpResponseResult updateShippedStatus(List<String> orderNo) {
+        return null;
+    }
+
+    @Override
 	public HttpResponseResult<OrderCancelModel> cancelOrder(String orderNo, String reason) {
 		return null;
 	}
@@ -109,4 +117,19 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public HttpResponseResult<BigDecimal> balance(Long userId) {
 		return null;
 	}
+
+	@Override
+	public HttpResponseResult<Boolean> goodsStatusSynchronize(List<GoodsSubModel> goodsSubModelList) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<Boolean> goodsStockCountSynchronize(List<GoodsSubStockModel> goodsSubStockModels) {
+		return null;
+	}
+
+    @Override
+    public  HttpResponseResult<List<SchoolDto>> schoolListByIds(List<Long> schoolIds) {
+        return null;
+    }
 }

+ 1 - 1
mec-common/audit-log/src/main/java/com/yonge/log/interceptor/AuditLogInterceptor.java

@@ -41,7 +41,7 @@ public class AuditLogInterceptor extends HandlerInterceptorAdapter {
 
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
-        syncSaveLog(request, handler);
+//        syncSaveLog(request, handler);
     }
 
     public void syncSaveLog(HttpServletRequest request, Object handler) {

+ 13 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/BrandDto.java

@@ -0,0 +1,13 @@
+package com.ym.mec.common.dto;
+
+import lombok.Data;
+
+@Data
+public class BrandDto {
+
+    // 品牌ID
+    private Long id;
+
+    // 品牌名称
+    private String name;
+}

+ 86 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/OrderCreate.java

@@ -0,0 +1,86 @@
+package com.ym.mec.common.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-01-10
+ */
+@Data
+public class OrderCreate {
+
+//    @ApiModelProperty("乐团ID")
+    private String orchestraId;
+
+//    @ApiModelProperty("用户ID/学校ID")
+    private Long memberId;
+
+//    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+//    @ApiModelProperty("订单总金额")
+    private BigDecimal totalAmount;
+
+//    @ApiModelProperty("支付类型  1->支付宝;2->微信")
+    private Integer payType;
+
+//    @ApiModelProperty(value = "收货人姓名")
+    private String receiverName;
+
+//    @ApiModelProperty(value = "收货人电话")
+    private String receiverPhone;
+
+//    @ApiModelProperty(value = "收货人邮编")
+    private String receiverPostCode;
+
+//    @ApiModelProperty(value = "省份/直辖市")
+    private String receiverProvince;
+
+//    @ApiModelProperty(value = "城市")
+    private String receiverCity;
+
+//    @ApiModelProperty(value = "区")
+    private String receiverRegion;
+
+//    @ApiModelProperty(value = "订单来源 ")
+    private String orderFormType = "MEC";
+
+
+//    @ApiModelProperty(value = "订单来源 SCHOOL:学校,STUDENT:学生")
+    private String platformType = "SCHOOL";
+
+//    @ApiModelProperty(value = "详细地址")
+    private String receiverDetailAddress;
+
+//    @ApiModelProperty("商品详情")
+    private List<OrderItem> orderItemList;
+
+
+//    @ApiModelProperty(value = "订单来源:0->PC订单;1->app订单 2->学校采购 3 个人订单 4 其他订单")
+    private Integer sourceType;
+
+
+//    @ApiModelProperty(value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单")
+    private Integer status;
+    @Data
+    public static class OrderItem implements Serializable {
+
+
+//        @ApiModelProperty(value = "购买数量")
+        private Integer productQuantity;
+
+//        @ApiModelProperty(value = "商品sku编号")
+        private Long productSkuId;
+
+//        @ApiModelProperty(value = "该商品经过优惠后的分解金额")
+        private BigDecimal realAmount;
+
+    }
+
+}

+ 45 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/PmsProductDto.java

@@ -0,0 +1,45 @@
+package com.ym.mec.common.dto;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class PmsProductDto implements Serializable {
+    //skuStockId
+    private Integer skuStockId;
+
+    private Long goodsId;
+
+    private String skuCode;
+
+    private String name;
+    //货号
+    private String productSn;
+
+    //删除状态:0->未删除;1->已删除
+    private Integer deleteStatus;
+
+    //上架状态:0->下架;1->上架
+    private Integer publishStatus;
+
+    private BigDecimal price;
+
+    //库存
+    private Integer stock;
+
+    private Long brandId;
+
+    //品牌名称
+    private String brandName;
+
+    private Long productCategoryId;
+    //商品分类名称
+    private String productCategoryName;
+
+
+    //"商品销售属性,json格式"
+    private String spData;
+}

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

@@ -0,0 +1,40 @@
+package com.ym.mec.common.dto;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class PmsProductQueryParamDto {
+    //skuId多个逗号隔开
+    private String skuStockIds;
+    //上架状态
+    private Integer publishStatus;
+    //商品名称模糊关键字
+    private String keyword;
+    //商品货号
+    private String productSn;
+    //商品编号,多个逗号隔开
+    private String productIds;
+    //需要排除的商品编号
+    private String excludeProductIds;
+    //商品分类
+    private Long productCategoryId;
+    //商品品牌
+    private Long brandId;
+
+//    @NotNull(message = "每页条数不能为空")
+    private Integer pageSize;
+//    @NotNull(message = "页码不能为空")
+    private Integer pageNum;
+
+    private String json;
+}

+ 12 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/ProductAttributeCategoryDto.java

@@ -0,0 +1,12 @@
+package com.ym.mec.common.dto;
+
+import lombok.Data;
+
+@Data
+public class ProductAttributeCategoryDto {
+//    @ApiModelProperty("商品类型ID")
+    private Long id;
+
+//    @ApiModelProperty("名称")
+    private String name;
+}

+ 15 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/ProductCategoryDto.java

@@ -0,0 +1,15 @@
+package com.ym.mec.common.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ProductCategoryDto {
+
+    private Long id;
+
+    private Long parentId;
+
+    private String name;
+}

+ 23 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/dto/SchoolDto.java

@@ -0,0 +1,23 @@
+package com.ym.mec.common.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-01-10
+ */
+@Data
+public class SchoolDto {
+
+    // 学校ID
+    private Long id;
+
+    // 学校名称
+    private String name;
+}

+ 13 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/GoodsSubModel.java

@@ -0,0 +1,13 @@
+package com.ym.mec.common.entity;
+
+import lombok.Data;
+
+@Data
+public class GoodsSubModel {
+
+    private Integer mallGoodsId;
+
+    private Integer skuId;
+
+    private Boolean goodsStatus;
+}

+ 13 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/GoodsSubStockModel.java

@@ -0,0 +1,13 @@
+package com.ym.mec.common.entity;
+
+import lombok.Data;
+
+@Data
+public class GoodsSubStockModel {
+
+    private Integer mallGoodsId;
+
+    private Integer sku;
+
+    private Integer stock;
+}

+ 1 - 1
mec-common/common-core/src/main/java/com/ym/mec/common/page/PageInfo.java

@@ -138,6 +138,7 @@ public class PageInfo<T> implements Serializable {
 	}
 
 	public int getTotalPage() {
+		this.totalPage = new BigDecimal(total).divide(new BigDecimal(limit), 0, BigDecimal.ROUND_CEILING).intValue();
 		return totalPage;
 	}
 
@@ -147,7 +148,6 @@ public class PageInfo<T> implements Serializable {
 
 	public void setTotal(int total) {
 		this.total = total;
-		this.totalPage=new BigDecimal(total).divide(new BigDecimal(limit),0,BigDecimal.ROUND_CEILING).intValue();
 	}
 
 	public List<T> getRows() {

+ 4 - 0
mec-mall/mall-admin/pom.xml

@@ -49,6 +49,10 @@
             <artifactId>easyexcel</artifactId>
             <version>3.2.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.ym</groupId>
+            <artifactId>mec-client-api</artifactId>
+        </dependency>
 
 
     </dependencies>

+ 2 - 1
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java

@@ -30,7 +30,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 .permitAll()
             .and()
                 .authorizeRequests()
-                .antMatchers("/wechat/*","/feign-client/**","/v2/api-docs", "/code/*","/payment/callback","/admin/login","/open/**")
+                .antMatchers("/wechat/*","/feign-client/**","/v2/api-docs", "/code/*","/payment/callback","/admin/login","/doc.html",
+                    "/open/**","/swagger-resources/**", "/webjars/**", "/swagger-ui.html")
             .permitAll().anyRequest().authenticated().and().httpBasic();
     }
 

+ 114 - 4
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/ExportController.java

@@ -1,20 +1,36 @@
 package com.yonge.cooleshow.admin.controller;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.admin.dao.PmsSkuStockDao;
 import com.yonge.cooleshow.admin.dto.OmsOrderQueryParam;
 import com.yonge.cooleshow.admin.dto.OrderDetailVo;
+import com.yonge.cooleshow.admin.dto.PmsProductQueryParam;
 import com.yonge.cooleshow.admin.service.OmsOrderService;
+import com.yonge.cooleshow.admin.service.PmsProductService;
+import com.yonge.cooleshow.admin.service.PmsProductSkuStockRecordService;
+import com.yonge.cooleshow.admin.wrapper.PmsProductSkuStockRecordWrapper;
+import com.yonge.cooleshow.admin.wrapper.PmsProductWrapper;
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
+import com.yonge.cooleshow.mall.common.api.CommonPage;
+import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mbg.dto.PmsSkuStockDto;
+import com.yonge.cooleshow.mbg.mapper.PmsSkuStockMapper;
+import com.yonge.cooleshow.mbg.model.PmsProduct;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @Api(tags = "数据导出服务")
@@ -23,6 +39,15 @@ public class ExportController {
     @Autowired
     private OmsOrderService orderService;
 
+    @Autowired
+    private PmsProductSkuStockRecordService pmsProductSkuStockRecordService;
+
+    @Autowired
+    private PmsProductService productService;
+
+    @Autowired
+    private PmsSkuStockMapper skuStockMapper;
+
     @ApiOperation("订单详情")
     @RequestMapping(value = "/orderDetail", method = RequestMethod.POST)
     public void orderDetail(@RequestBody OmsOrderQueryParam queryParam, HttpServletResponse response) throws IOException {
@@ -35,4 +60,89 @@ public class ExportController {
         response.setHeader("Content-disposition", "attachment;filename=订单详情.xlsx");
         EasyExcel.write(response.getOutputStream(), OrderDetailVo.class).sheet("订单详情").doWrite(orderList);
     }
+
+
+    @ApiOperation("商品库存入库记录")
+    @PostMapping(value = "/pmsProductSkuStockRecord")
+    public void getList(@RequestBody @Validated PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecordQuery query, HttpServletResponse response) throws IOException {
+        query.setPageSize(99999);
+        List<PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord> productList = pmsProductSkuStockRecordService.list(query);
+        // 设置文本内省
+        response.setContentType("application/vnd.ms-excel");
+        // 设置字符编码
+        response.setCharacterEncoding("utf-8");
+        // 设置响应头
+        response.setHeader("Content-disposition", "attachment;filename=商品库存入库记录.xlsx");
+        EasyExcel.write(response.getOutputStream(), PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord.class)
+            .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+            .sheet("商品库存入库记录").doWrite(productList);
+    }
+
+
+    @ApiOperation("商品库存导出")
+    @RequestMapping(value = "/productExport", method = RequestMethod.GET)
+    @ResponseBody
+    public void productExport(PmsProductQueryParam productQueryParam, HttpServletResponse response) throws IOException {
+        List<PmsProduct> productList = productService.list(productQueryParam, 99999, 1);
+
+        List<PmsProductWrapper.PmsProductExport> list = JSON.parseArray(JSON.toJSONString(productList), PmsProductWrapper.PmsProductExport.class);
+        if (!CollectionUtils.isEmpty(list)) {
+            List<Long> productIds = list.stream().map(PmsProductWrapper.PmsProductExport::getId).collect(Collectors.toList());
+
+            // 计算库存数据
+            List<PmsSkuStockDto.PmsSkuStockStock> skuStockStocks = skuStockMapper.getSkuStockByProductIds(productIds);
+
+            // Convert to map
+            Map<Long, List<PmsSkuStockDto.PmsSkuStockStock>> skuStockStockMap = skuStockStocks.stream().collect(Collectors.groupingBy(PmsSkuStockDto.PmsSkuStockStock::getProductId));
+
+            // Merge
+            for (PmsProductWrapper.PmsProductExport pmsProductExport : list) {
+                List<PmsSkuStockDto.PmsSkuStockStock> skuStockStock = skuStockStockMap.get(pmsProductExport.getId());
+                if (!CollectionUtils.isEmpty(skuStockStock)) {
+                    pmsProductExport.setInternalStock(skuStockStock.stream().mapToInt(PmsSkuStockDto.PmsSkuStockStock::getInternalStock).sum());
+                    pmsProductExport.setTaxStock(skuStockStock.stream().mapToInt(PmsSkuStockDto.PmsSkuStockStock::getTaxStock).sum());
+                } else {
+                    pmsProductExport.setInternalStock(0);
+                    pmsProductExport.setTaxStock(0);
+                }
+            }
+        }
+
+
+        // 设置文本内省
+        response.setContentType("application/vnd.ms-excel");
+        // 设置字符编码
+        response.setCharacterEncoding("utf-8");
+        // 设置响应头
+        response.setHeader("Content-disposition", "attachment;filename=商品库存导出.xlsx");
+        EasyExcel.write(response.getOutputStream(), PmsProductWrapper.PmsProductExport.class)
+            .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+            .sheet("商品库存导出").doWrite(list);
+    }
+
+
+    @ApiOperation("商品进货清单导出")
+    @RequestMapping(value = "/productStockRecordExport", method = RequestMethod.GET)
+    @ResponseBody
+    public void productStockRecordExport(PmsProductQueryParam productQueryParam, HttpServletResponse response) throws IOException {
+        List<PmsProduct> productList = productService.list(productQueryParam, 99999, 1);
+
+
+        PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecordQuery query = new PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecordQuery();
+        query.setPageSize(99999);
+        // id 集合
+        List<Long> productIds = productList.stream().map(PmsProduct::getId).collect(Collectors.toList());
+        query.setProductIds(productIds);
+        List<PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord> productRecordList = pmsProductSkuStockRecordService.list(query);
+
+        // 设置文本内省
+        response.setContentType("application/vnd.ms-excel");
+        // 设置字符编码
+        response.setCharacterEncoding("utf-8");
+        // 设置响应头
+        response.setHeader("Content-disposition", "attachment;filename=商品进货清单导出.xlsx");
+        EasyExcel.write(response.getOutputStream(), PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord.class)
+            .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+            .sheet("商品进货清单导出").doWrite(productRecordList);
+    }
 }

+ 84 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PmsProductSkuStockRecordController.java

@@ -0,0 +1,84 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.yonge.cooleshow.admin.dto.PmsProductParam;
+import com.yonge.cooleshow.admin.dto.PmsProductQueryParam;
+import com.yonge.cooleshow.admin.dto.PmsProductResult;
+import com.yonge.cooleshow.admin.service.PmsProductService;
+import com.yonge.cooleshow.admin.service.PmsProductSkuStockRecordService;
+import com.yonge.cooleshow.admin.wrapper.PmsProductSkuStockRecordWrapper;
+import com.yonge.cooleshow.mall.common.api.CommonPage;
+import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mall.common.api.ResultCode;
+import com.yonge.cooleshow.mbg.model.PmsProduct;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 商品管理Controller
+ * Created by macro on 2018/4/26.
+ */
+@RestController
+@Api(tags = "PmsProductSkuStockRecordController", description = "商品库存入库记录")
+@RequestMapping("/PmsProductSkuStockRecord")
+public class PmsProductSkuStockRecordController {
+    @Autowired
+    private PmsProductSkuStockRecordService pmsProductSkuStockRecordService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation("商品库存入库记录")
+    @PostMapping(value = "/list")
+    public CommonResult<CommonPage<PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord>> getList(@RequestBody
+                                      @Validated PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecordQuery query) {
+        List<PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord> productList = pmsProductSkuStockRecordService.list(query);
+        return CommonResult.success(CommonPage.restPage(productList));
+    }
+
+    @ApiOperation("新增商品库存入库记录")
+    @RequestMapping(value = "/create", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult create(@RequestBody @Validated PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            return CommonResult.failed(ResultCode.FORBIDDEN, "请登录");
+        }
+        pmsProductSkuStockRecord.setCreateBy(sysUser.getId().longValue());
+        int count = pmsProductSkuStockRecordService.create(pmsProductSkuStockRecord);
+        if (count > 0) {
+            return CommonResult.success(count);
+        } else {
+            return CommonResult.failed();
+        }
+    }
+
+
+    @ApiOperation("新增商品库存入库记录")
+    @RequestMapping(value = "/update", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult update(@RequestBody @Validated PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            return CommonResult.failed(ResultCode.FORBIDDEN, "请登录");
+        }
+        pmsProductSkuStockRecord.setCreateBy(sysUser.getId().longValue());
+        pmsProductSkuStockRecord.setCreateTime(new Date());
+        int count = pmsProductSkuStockRecordService.update(pmsProductSkuStockRecord);
+        if (count > 0) {
+            return CommonResult.success(count);
+        } else {
+            return CommonResult.failed();
+        }
+    }
+}

+ 3 - 2
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/PmsSkuStockController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import com.yonge.cooleshow.admin.service.PmsSkuStockService;
@@ -25,8 +26,8 @@ public class PmsSkuStockController {
     @ApiOperation("根据商品ID及sku编码模糊搜索sku库存")
     @RequestMapping(value = "/{pid}", method = RequestMethod.GET)
     @ResponseBody
-    public CommonResult<List<PmsSkuStock>> getList(@PathVariable Long pid, @RequestParam(value = "keyword",required = false) String keyword) {
-        List<PmsSkuStock> skuStockList = skuStockService.getList(pid, keyword);
+    public CommonResult<List<PmsSkuStockWrapper.PmsSkuStock>> getList(@PathVariable Long pid, @RequestParam(value = "keyword",required = false) String keyword) {
+        List<PmsSkuStockWrapper.PmsSkuStock> skuStockList = skuStockService.getList(pid, keyword);
         return CommonResult.success(skuStockList);
     }
     @ApiOperation("批量更新sku库存信息")

+ 102 - 6
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java

@@ -1,9 +1,19 @@
 package com.yonge.cooleshow.admin.controller.open;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.api.R;
+import com.ym.mec.common.dto.PmsProductDto;
+import com.ym.mec.common.dto.PmsProductQueryParamDto;
+import com.ym.mec.common.page.PageInfo;
 import com.yonge.cooleshow.admin.controller.OmsOrderReturnApplyController;
-import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
+import com.yonge.cooleshow.admin.dto.OrderCreate;
+import com.yonge.cooleshow.admin.dto.PmsProductCategoryWithChildrenItem;
+import com.yonge.cooleshow.admin.service.*;
+import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mbg.model.PmsBrand;
+import com.yonge.cooleshow.mbg.model.PmsProductAttributeCategory;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.redisson.api.RLock;
@@ -12,12 +22,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -26,7 +36,7 @@ import java.util.concurrent.TimeUnit;
  * @author liujunchi
  * @date 2022-07-28
  */
-@Controller
+@RestController
 @RequestMapping("/open")
 public class OpenController {
     @Autowired
@@ -39,6 +49,21 @@ public class OpenController {
     @Autowired
     private RedissonClient redissonClient;
 
+    @Autowired
+    private PmsProductService productService;
+
+    @Autowired
+    private PmsBrandService brandService;
+
+    @Autowired
+    private PmsProductCategoryService productCategoryService;
+
+    @Autowired
+    private PmsProductAttributeCategoryService productAttributeCategoryService;
+
+    @Autowired
+    private OmsOrderService orderService;
+
     private static final Logger log = LoggerFactory.getLogger(OmsOrderReturnApplyController.class);
 
     @ApiOperation("完成退货测试接口")
@@ -66,4 +91,75 @@ public class OpenController {
         return CommonResult.failed();
     }
 
+
+
+    /**
+     * 查询商品订单生成
+     * @param order ProductWrapper.OrderCreate
+     * @return String
+     */
+    @PostMapping(value = "/product/orderCreate", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productOrderCreate(@RequestBody OrderCreate order) {
+
+        log.info("创建管乐迷订单:{}", JSON.toJSONString(order));
+
+        orderService.mecProductOrderCreate(order);
+
+
+        return R.ok(true);
+    }
+
+
+    // 同步订单状态,
+    /**
+     * 查询商品订单状态
+     * @param orderNo 订单编号
+     * @return status 订单状态  0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
+     */
+    @GetMapping(value = "/product/updateOrderStatus", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public boolean productUpdateOrderStatus(@RequestParam("orderNo") String orderNo,@RequestParam("status") Integer status) {
+        log.info("同步订单状态:{},{}", orderNo, status);
+        // 已发货订单不可修改状态
+        return orderService.productUpdateOrderStatus(orderNo, status);
+    }
+
+    @PostMapping(value = "/product/list")
+    @ResponseBody
+    public PageInfo<PmsProductDto> getProductList(@RequestBody @Validated PmsProductQueryParamDto productQueryParam){
+        String json = productQueryParam.getJson();
+        productQueryParam = JSON.parseObject(json,PmsProductQueryParamDto.class);
+        List<PmsProductDto> feignProductList = productService.getFeignProductList(productQueryParam);
+        CommonPage<PmsProductDto> dtoCommonPage = CommonPage.restPage(feignProductList);
+        PageInfo<PmsProductDto> pageInfo = new PageInfo<>(productQueryParam.getPageNum(),productQueryParam.getPageSize());
+        pageInfo.setRows(feignProductList);
+        pageInfo.setTotal(dtoCommonPage.getTotal().intValue());
+        return pageInfo;
+
+    }
+
+
+    @ApiOperation(value = "根据品牌名称分页获取品牌列表")
+    @RequestMapping(value = "/brand/list", method = RequestMethod.GET)
+    @ResponseBody
+    public List<PmsBrand> getList() {
+        List<PmsBrand> brandList = brandService.listBrand("", 1, 9999);
+        return brandList;
+    }
+
+    @ApiOperation("查询所有一级分类及子分类")
+    @RequestMapping(value = "/productCategory/list/withChildren", method = RequestMethod.GET)
+    @ResponseBody
+    public List<PmsProductCategoryWithChildrenItem> listWithChildren() {
+        List<PmsProductCategoryWithChildrenItem> list = productCategoryService.listWithChildren();
+        return list;
+    }
+
+
+    @ApiOperation("分页获取所有商品属性分类")
+    @RequestMapping(value = "productAttribute/category/list", method = RequestMethod.GET)
+    public List<PmsProductAttributeCategory> getProductAttributeCategoryList() {
+        List<PmsProductAttributeCategory> productAttributeCategoryList = productAttributeCategoryService.getList(9999, 1);
+        CommonPage<PmsProductAttributeCategory> pmsProductAttributeCategoryCommonPage = CommonPage.restPage(productAttributeCategoryList);
+        return pmsProductAttributeCategoryCommonPage.getList();
+    }
 }

+ 8 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/PmsProductDao.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.admin.dao;
 
+import com.ym.mec.common.dto.PmsProductDto;
+import com.ym.mec.common.dto.PmsProductQueryParamDto;
 import com.yonge.cooleshow.admin.dto.HomeStatistical;
 import com.yonge.cooleshow.admin.dto.PmsProductQueryParam;
 import com.yonge.cooleshow.admin.dto.PmsProductResult;
@@ -24,4 +26,10 @@ public interface PmsProductDao {
     HomeStatistical selectProductShowStatusCount();
 
     List<PmsProduct> list(@Param("param") PmsProductQueryParam productQueryParam);
+
+
+    /**
+     * 获取商品SKU列表
+     */
+    List<PmsProductDto> getFeignProductList(@Param("param") PmsProductQueryParamDto productQueryParam);
 }

+ 23 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/PmsProductSkuStockRecordDao.java

@@ -0,0 +1,23 @@
+package com.yonge.cooleshow.admin.dao;
+
+import com.yonge.cooleshow.admin.dto.HomeStatistical;
+import com.yonge.cooleshow.admin.dto.PmsProductQueryParam;
+import com.yonge.cooleshow.admin.dto.PmsProductResult;
+import com.yonge.cooleshow.admin.wrapper.PmsProductSkuStockRecordWrapper;
+import com.yonge.cooleshow.mbg.model.PmsProduct;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+/**
+ * 商品管理自定义Dao
+ * Created by macro on 2018/4/26.
+ */
+public interface PmsProductSkuStockRecordDao {
+
+    /**
+     * 列表
+     */
+    List<PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord> list(@Param("param") PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecordQuery query);
+}

+ 3 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/PmsSkuStockDao.java

@@ -1,8 +1,10 @@
 package com.yonge.cooleshow.admin.dao;
 
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -19,4 +21,5 @@ public interface PmsSkuStockDao {
      * 批量插入或替换操作
      */
     int replaceList(@Param("list")List<PmsSkuStock> skuStockList);
+
 }

+ 86 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/OrderCreate.java

@@ -0,0 +1,86 @@
+package com.yonge.cooleshow.admin.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-01-10
+ */
+@Data
+public class OrderCreate {
+
+    @ApiModelProperty("乐团ID")
+    private String orchestraId;
+
+    @ApiModelProperty("用户ID/学校ID")
+    private Long memberId;
+
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+    @ApiModelProperty("订单总金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty("支付类型  1->支付宝;2->微信")
+    private Integer payType;
+
+    @ApiModelProperty(value = "收货人姓名")
+    private String receiverName;
+
+    @ApiModelProperty(value = "收货人电话")
+    private String receiverPhone;
+
+    @ApiModelProperty(value = "收货人邮编")
+    private String receiverPostCode;
+
+    @ApiModelProperty(value = "省份/直辖市")
+    private String receiverProvince;
+
+    @ApiModelProperty(value = "城市")
+    private String receiverCity;
+
+    @ApiModelProperty(value = "区")
+    private String receiverRegion;
+
+    @ApiModelProperty(value = "订单来源 ")
+    private String orderFormType = "MEC";
+
+
+    @ApiModelProperty(value = "订单来源 SCHOOL:学校,STUDENT:学生,TEACHER:老师")
+    private String platformType = "SCHOOL";
+
+    @ApiModelProperty(value = "详细地址")
+    private String receiverDetailAddress;
+    @ApiModelProperty(value = "订单来源:0->PC订单;1->app订单 2->学校采购 3 个人订单 4 其他订单")
+    private Integer sourceType;
+
+
+    @ApiModelProperty(value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单")
+    private Integer status;
+
+    @ApiModelProperty("商品详情")
+    private List<OrderItem> orderItemList;
+
+    @Data
+    public static class OrderItem implements Serializable {
+
+
+        @ApiModelProperty(value = "购买数量")
+        private Integer productQuantity;
+
+        @ApiModelProperty(value = "商品sku编号")
+        private Long productSkuId;
+
+        @ApiModelProperty(value = "该商品经过优惠后的分解金额")
+        private BigDecimal realAmount;
+
+    }
+
+}

+ 2 - 55
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/PmsProductQueryParam.java

@@ -1,12 +1,13 @@
 package com.yonge.cooleshow.admin.dto;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 /**
  * 商品查询参数
  * Created by macro on 2018/4/27.
  */
-
+@Data
 public class PmsProductQueryParam {
     @ApiModelProperty("上架状态")
     private Integer publishStatus;
@@ -24,59 +25,5 @@ public class PmsProductQueryParam {
     @ApiModelProperty("是否缺货 0:否,1;是")
     private Integer stock;
 
-    public Integer getStock() {
-        return stock;
-    }
-
-    public void setStock(Integer stock) {
-        this.stock = stock;
-    }
-
-    public Integer getPublishStatus() {
-        return publishStatus;
-    }
-
-    public void setPublishStatus(Integer publishStatus) {
-        this.publishStatus = publishStatus;
-    }
-
-    public Integer getVerifyStatus() {
-        return verifyStatus;
-    }
-
-    public void setVerifyStatus(Integer verifyStatus) {
-        this.verifyStatus = verifyStatus;
-    }
-
-    public String getKeyword() {
-        return keyword;
-    }
-
-    public void setKeyword(String keyword) {
-        this.keyword = keyword;
-    }
-
-    public String getProductSn() {
-        return productSn;
-    }
-
-    public void setProductSn(String productSn) {
-        this.productSn = productSn;
-    }
-
-    public Long getProductCategoryId() {
-        return productCategoryId;
-    }
-
-    public void setProductCategoryId(Long productCategoryId) {
-        this.productCategoryId = productCategoryId;
-    }
-
-    public Long getBrandId() {
-        return brandId;
-    }
 
-    public void setBrandId(Long brandId) {
-        this.brandId = brandId;
-    }
 }

+ 8 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderService.java

@@ -25,6 +25,8 @@ public interface OmsOrderService {
     @Transactional
     int delivery(List<OmsOrderDeliveryParam> deliveryParamList);
 
+    void syncSkuStock(List<Long> skuIds);
+
     /**
      * 批量关闭订单
      */
@@ -92,4 +94,10 @@ public interface OmsOrderService {
     HomeOrderStatistical orderStatistical(OrderStatisticalSearch search);
 
     List<OrderDetailVo> queryOrderDetail(OmsOrderQueryParam queryParam);
+
+
+    void mecProductOrderCreate(OrderCreate order);
+
+    // 同步订单状态,
+    boolean productUpdateOrderStatus(String orderNo, Integer status);
 }

+ 3 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsBrandService.java

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.mbg.model.PmsBrand;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 商品品牌管理Service
@@ -61,4 +62,6 @@ public interface PmsBrandService {
      */
     @Transactional
     int updateFactoryStatus(List<Long> ids, Integer factoryStatus);
+
+    Map<Long,PmsBrand> getMapByIds(List<Long> brandIds);
 }

+ 3 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductCategoryService.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.mbg.model.PmsProductCategory;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 商品分类管理Service
@@ -56,4 +57,6 @@ public interface PmsProductCategoryService {
      * 以层级形式获取商品分类
      */
     List<PmsProductCategoryWithChildrenItem> listWithChildren();
+
+    Map<Long,PmsProductCategory> getMapByIds(List<Long> categoryIds);
 }

+ 11 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductService.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.admin.service;
 
+import com.ym.mec.common.dto.PmsProductDto;
+import com.ym.mec.common.dto.PmsProductQueryParamDto;
 import com.yonge.cooleshow.admin.dto.HomeStatistical;
 import com.yonge.cooleshow.admin.dto.PmsProductParam;
 import com.yonge.cooleshow.admin.dto.PmsProductQueryParam;
@@ -10,6 +12,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 商品管理Service
@@ -87,4 +90,12 @@ public interface PmsProductService {
      * @return
      */
     HomeStatistical countProductShowStatus();
+
+    Map<Long, PmsProduct> getMapByIds(List<Long> productIds);
+
+    /**
+     * 获取商品SKU列表
+     *
+     */
+    List<PmsProductDto> getFeignProductList(PmsProductQueryParamDto productQueryParam);
 }

+ 39 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsProductSkuStockRecordService.java

@@ -0,0 +1,39 @@
+package com.yonge.cooleshow.admin.service;
+
+import com.yonge.cooleshow.admin.dto.HomeStatistical;
+import com.yonge.cooleshow.admin.dto.PmsProductParam;
+import com.yonge.cooleshow.admin.dto.PmsProductQueryParam;
+import com.yonge.cooleshow.admin.dto.PmsProductResult;
+import com.yonge.cooleshow.admin.wrapper.PmsProductSkuStockRecordWrapper;
+import com.yonge.cooleshow.mbg.model.PmsProduct;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 商品管理Service
+ * Created by macro on 2018/4/26.
+ */
+public interface PmsProductSkuStockRecordService {
+
+
+    /**
+     * 列表分页
+     *
+     */
+    List<PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord> list(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecordQuery query);
+
+    /**
+     * 新增
+     *
+     */
+    int create(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord);
+
+    /**
+     * 修改
+     *
+     */
+    int update(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord);
+}

+ 5 - 1
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/PmsSkuStockService.java

@@ -1,9 +1,11 @@
 package com.yonge.cooleshow.admin.service;
 
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 商品SKU库存管理Service
@@ -13,11 +15,13 @@ public interface PmsSkuStockService {
     /**
      * 根据产品id和skuCode关键字模糊搜索
      */
-    List<PmsSkuStock> getList(Long pid, String keyword);
+    List<PmsSkuStockWrapper.PmsSkuStock> getList(Long pid, String keyword);
 
     /**
      * 批量更新商品库存信息
      */
     @Transactional
     int update(Long pid, List<PmsSkuStock> skuStockList);
+
+    Map<Long,PmsSkuStock> getMapByIds(List<Long> skuIds);
 }

+ 21 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/UmsMemberService.java

@@ -0,0 +1,21 @@
+package com.yonge.cooleshow.admin.service;
+
+import com.yonge.cooleshow.mbg.model.UmsMember;
+import org.springframework.security.core.userdetails.UserDetails;
+
+/**
+ * 会员管理Service
+ * Created by macro on 2018/8/3.
+ */
+public interface UmsMemberService {
+    /**
+     * 根据会员编号获取会员
+     */
+    UmsMember getById(Long id);
+
+
+    /**
+     * 获取当前登录会员
+     */
+    UmsMember getCurrentMember();
+}

+ 351 - 19
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -1,24 +1,26 @@
 package com.yonge.cooleshow.admin.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.github.pagehelper.PageHelper;
+import com.google.common.collect.Lists;
+import com.ym.mec.common.dto.SchoolDto;
+import com.ym.mec.common.entity.GoodsSubStockModel;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.web.WebFeignService;
 import com.yonge.cooleshow.admin.dao.OmsOrderDao;
 import com.yonge.cooleshow.admin.dao.OmsOrderOperateHistoryDao;
 import com.yonge.cooleshow.admin.dto.*;
 import com.yonge.cooleshow.admin.dto.search.OrderStatisticalSearch;
 import com.yonge.cooleshow.admin.dto.search.UserStatisticalSearch;
-import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
-import com.yonge.cooleshow.admin.service.PmsProductService;
-import com.yonge.cooleshow.mbg.mapper.OmsOrderMapper;
-import com.yonge.cooleshow.mbg.mapper.OmsOrderOperateHistoryMapper;
-import com.yonge.cooleshow.mbg.model.OmsOrder;
-import com.yonge.cooleshow.mbg.model.OmsOrderExample;
-import com.yonge.cooleshow.mbg.model.OmsOrderOperateHistory;
-import com.yonge.cooleshow.admin.service.OmsOrderService;
 import com.yonge.cooleshow.admin.enums.OrderStatisticalEnum;
+import com.yonge.cooleshow.admin.service.*;
+import com.yonge.cooleshow.mbg.mapper.*;
+import com.yonge.cooleshow.mbg.model.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
@@ -54,31 +56,217 @@ public class OmsOrderServiceImpl implements OmsOrderService {
     @Autowired
     private PmsProductService productService;
 
+    @Autowired
+    private OmsOrderItemMapper omsOrderItemMapper;
+
+    @Autowired
+    private PmsProductSkuStockRecordMapper pmsProductSkuStockRecordMapper;
+
+    @Autowired
+    private WebFeignService webFeignService;
+
+    @Autowired
+    private PmsSkuStockService pmsSkuStockService;
+
+
+    @Autowired
+    private OmsOrderSettingMapper orderSettingMapper;
+
+    @Autowired
+    private UmsMemberService umsMemberService;
+
+    @Autowired
+    private PmsSkuStockMapper skuStockMapper;
+
+    @Autowired
+    private PmsProductMapper pmsProductMapper;
+
+
+
     @Override
     public List<OrderVo> list(OmsOrderQueryParam queryParam, Integer pageSize, Integer pageNum) {
         PageHelper.startPage(pageNum, pageSize);
-        return orderDao.getList(queryParam);
+        List<OrderVo> list = orderDao.getList(queryParam);
+
+        // 过滤出学校订单,查询学校信息
+        List<Long> schoolIds = list.stream().filter(o->o.getSourceType() ==2).map(OmsOrder::getMemberId).collect(Collectors.toList());
+
+        if (!CollectionUtils.isEmpty(schoolIds)) {
+            HttpResponseResult<List<SchoolDto>> schoolDtoHttpResponseResult = webFeignService.schoolListByIds(schoolIds);
+            if (schoolDtoHttpResponseResult.getCode() == 200 && schoolDtoHttpResponseResult.getStatus()) {
+                Map<Long, SchoolDto> schoolDtoMap = schoolDtoHttpResponseResult.getData().stream().collect(Collectors.toMap(SchoolDto::getId, o -> o));
+                list.forEach(o->{
+                    if (o.getSourceType() == 2) {
+                        SchoolDto schoolDto = schoolDtoMap.get(o.getMemberId());
+                        if (schoolDto != null) {
+                            o.setMemberUsername(schoolDto.getName());
+                        }
+                    }
+                });
+            }
+        }
+
+        return list;
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int delivery(List<OmsOrderDeliveryParam> deliveryParamList) {
         //批量发货
         int count = orderDao.delivery(deliveryParamList);
+
+        // 扣减库存
+        //库存扣减规则更新
+        //扣减顺序:内部库存>税务库存>进货批次
+        //先把所有批次的内部库存扣完,再扣税务库存,例如:
+        //第一批   内部0     税务10
+        //第二批   内部10   税务10
+        //这个时候发货10个商品,扣减的是第二批的内部10,再发货10个商品扣减的是第一批的税务10
+
+        // 查询出所有订单关联的skuId
+        // 订单ID集合
+        List<Long> orderIds = deliveryParamList.stream().map(OmsOrderDeliveryParam::getOrderId).collect(Collectors.toList());
+        // 查询订单详情
+        OmsOrderItemExample example = new OmsOrderItemExample();
+        example.createCriteria().andOrderIdIn(orderIds);
+        List<OmsOrderItem> omsOrderItems = omsOrderItemMapper.selectByExample(example);
+        // skuId 数量 map
+        Map<Long, Integer> skuIdMap = omsOrderItems.stream().collect(Collectors.groupingBy(OmsOrderItem::getProductSkuId,Collectors.summingInt(OmsOrderItem::getProductQuantity)));
+
+        // skuid 集合
+        List<Long> skuIds = new ArrayList<>(skuIdMap.keySet());
+        updateSkuStock( skuIdMap, orderIds);
+
+
         //添加操作记录
         List<OmsOrderOperateHistory> operateHistoryList = deliveryParamList.stream()
-                .map(omsOrderDeliveryParam -> {
-                    OmsOrderOperateHistory history = new OmsOrderOperateHistory();
-                    history.setOrderId(omsOrderDeliveryParam.getOrderId());
-                    history.setCreateTime(new Date());
-                    history.setOperateMan("后台管理员");
-                    history.setOrderStatus(2);
-                    history.setNote("完成发货");
-                    return history;
-                }).collect(Collectors.toList());
+            .map(omsOrderDeliveryParam -> {
+                OmsOrderOperateHistory history = new OmsOrderOperateHistory();
+                history.setOrderId(omsOrderDeliveryParam.getOrderId());
+                history.setCreateTime(new Date());
+                history.setOperateMan("后台管理员");
+                history.setOrderStatus(2);
+                history.setNote("完成发货");
+                return history;
+            }).collect(Collectors.toList());
         orderOperateHistoryDao.insertList(operateHistoryList);
+
         return count;
     }
 
+    /**
+     * 库存更新
+     */
+//    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateSkuStock(Map<Long, Integer> skuIdMap, List<Long> orderIds) {
+        // 查询库存
+        PmsProductSkuStockRecordExample stockRecordExample = new PmsProductSkuStockRecordExample();
+        stockRecordExample.createCriteria().andProductSkuIdIn(new ArrayList<>(skuIdMap.keySet()));
+        List<PmsProductSkuStockRecord> productSkuStockRecords = pmsProductSkuStockRecordMapper.selectByExample(stockRecordExample);
+        if (CollectionUtils.isEmpty(productSkuStockRecords)) {
+            throw new BizException("库存不足");
+        }
+        //id 集合
+        List<Long> stockRecordIds = productSkuStockRecords.stream().map(PmsProductSkuStockRecord::getId).collect(Collectors.toList());
+
+        // 根据ID锁定库存
+        pmsProductSkuStockRecordMapper.lockStock(stockRecordIds);
+
+        // 根据 skuID 分组
+        Map<Long, List<PmsProductSkuStockRecord>> skuStockRecordMap = productSkuStockRecords.stream().collect(Collectors.groupingBy(PmsProductSkuStockRecord::getProductSkuId));
+        // 扣减库存
+
+        List<PmsProductSkuStockRecord> updateList = new ArrayList<>();
+        skuIdMap.forEach((skuId, num) -> {
+            List<PmsProductSkuStockRecord> skuStockRecords = skuStockRecordMap.get(skuId);
+            if (CollectionUtils.isEmpty(skuStockRecords)) {
+                throw new BizException("库存不足");
+            }
+            int count1 = num;
+            // 扣减内部库存
+            for (PmsProductSkuStockRecord skuStockRecord : skuStockRecords) {
+                if (count1 <= 0) {
+                    break;
+                }
+                if (skuStockRecord.getInternalStock() > 0) {
+
+                    int stock = skuStockRecord.getInternalStock() - skuStockRecord.getInternalSaleStock();
+                    if (stock > 0) {
+                        PmsProductSkuStockRecord record = new PmsProductSkuStockRecord();
+                        record.setId(skuStockRecord.getId());
+
+                        if (stock >= count1) {
+                            record.setInternalSaleStock(skuStockRecord.getInternalSaleStock() + count1);
+                            count1 = 0;
+                        } else {
+                            count1 = count1 - stock;
+                            record.setInternalSaleStock(record.getInternalStock());
+                        }
+                        updateList.add(record);
+                    }
+                }
+            }
+            // 扣减税务库存
+            for (PmsProductSkuStockRecord skuStockRecord : skuStockRecords) {
+                if (count1 <= 0) {
+                    break;
+                }
+                if (skuStockRecord.getTaxStock() > 0) {
+                    int stock = skuStockRecord.getTaxStock() - skuStockRecord.getTaxSaleStock();
+                    if (stock > 0) {
+                        PmsProductSkuStockRecord record = new PmsProductSkuStockRecord();
+                        record.setId(skuStockRecord.getId());
+                        if (stock >= count1) {
+                            record.setTaxSaleStock(skuStockRecord.getTaxSaleStock() + count1);
+                            count1 = 0;
+                        } else {
+                            count1 = count1 - stock;
+                            record.setTaxSaleStock(record.getTaxStock());
+                        }
+                        updateList.add(record);
+                    }
+                }
+            }
+            if (count1 > 0) {
+                throw new BizException("库存不足");
+            }
+        });
+        for (PmsProductSkuStockRecord pmsProductSkuStockRecord : updateList) {
+            pmsProductSkuStockRecordMapper.updateByPrimaryKeySelective(pmsProductSkuStockRecord);
+        }
+
+        // 调用三方发货通知接口
+        OmsOrderExample orderExample = new OmsOrderExample();
+        orderExample.createCriteria().andIdIn(orderIds);
+        List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
+        // 订单号
+        List<String> orderSnList = omsOrders.stream().map(OmsOrder::getOrderSn).collect(Collectors.toList());
+        HttpResponseResult httpResponseResult = webFeignService.updateShippedStatus(orderSnList);
+        if (httpResponseResult.getCode() != 200 && !httpResponseResult.getStatus()) {
+            throw new BizException("发货通知失败");
+        }
+
+        // 调用三方库存更新接口
+        syncSkuStock(new ArrayList<>(skuIdMap.keySet()));
+    }
+
+    @Override
+    public void syncSkuStock(List<Long> skuIds) {
+        Map<Long, PmsSkuStock> skuStockMap = pmsSkuStockService.getMapByIds(skuIds);
+        List<GoodsSubStockModel> modelList = skuStockMap.values().stream().map(skuStock -> {
+            GoodsSubStockModel stockModel = new GoodsSubStockModel();
+            stockModel.setMallGoodsId(skuStock.getProductId().intValue());
+            stockModel.setSku(skuStock.getId().intValue());
+            stockModel.setStock(skuStock.getStock());
+            return stockModel;
+        }).collect(Collectors.toList());
+        HttpResponseResult<Boolean> booleanHttpResponseResult = webFeignService.goodsStockCountSynchronize(modelList);
+        if (booleanHttpResponseResult.getCode() != 200 && !booleanHttpResponseResult.getStatus()) {
+            throw new BizException("库存同步失败");
+        }
+    }
+
     @Override
     public int close(List<Long> ids, String note) {
         OmsOrder record = new OmsOrder();
@@ -118,7 +306,19 @@ public class OmsOrderServiceImpl implements OmsOrderService {
 
     @Override
     public OmsOrderDetail detail(Long id) {
-        return orderDao.getDetail(id);
+        OmsOrderDetail detail = orderDao.getDetail(id);
+
+        // 学校订单查询学校信息
+        if (detail.getSourceType() == 2) {
+            HttpResponseResult<List<SchoolDto>> schoolDtoHttpResponseResult = webFeignService.schoolListByIds(Lists.newArrayList(detail.getMemberId()));
+            if (schoolDtoHttpResponseResult.getCode() == 200 && schoolDtoHttpResponseResult.getStatus()) {
+                List<SchoolDto> data = schoolDtoHttpResponseResult.getData();
+                if (!CollectionUtils.isEmpty(data)) {
+                    detail.setMemberUsername(data.get(0).getName());
+                }
+            }
+        }
+        return detail;
     }
 
     @Override
@@ -382,4 +582,136 @@ public class OmsOrderServiceImpl implements OmsOrderService {
         }
         return statisticalInfo;
     }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void mecProductOrderCreate(OrderCreate order) {
+
+
+        // 查询订单是否已存在
+        OmsOrder detail = orderMapper.getByOrderSn(order.getOrderNo());
+        if (detail != null) {
+            throw new BizException("订单已存在");
+        }
+        UmsMember umsMember = null;
+        // 学校订单和其他订单没有个人信息
+        if (order.getPlatformType().equals("STUDENT")) {
+            umsMember = umsMemberService.getById(order.getMemberId());
+        }
+
+
+        // 创建订单
+
+        //设置自动收货天数
+        List<OmsOrderSetting> orderSettings = orderSettingMapper.selectByExample(new OmsOrderSettingExample());
+
+
+        detail = new OmsOrder();
+        detail.setOrchestraId(order.getOrchestraId());
+        detail.setOrderFormType(order.getOrderFormType());
+        detail.setMemberId(order.getMemberId());
+        detail.setPlatformType(order.getPlatformType());
+        detail.setOrderSn(order.getOrderNo());
+        detail.setCreateTime(new Date());
+        if (umsMember !=null) {
+            detail.setMemberUsername(umsMember.getUsername());
+        }
+        detail.setTotalAmount(order.getTotalAmount());
+        detail.setPayAmount(order.getTotalAmount());
+        detail.setFreightAmount(BigDecimal.ZERO);
+        detail.setPromotionAmount(BigDecimal.ZERO);
+        detail.setIntegrationAmount(BigDecimal.ZERO);
+        detail.setCouponAmount(BigDecimal.ZERO);
+        detail.setDiscountAmount(BigDecimal.ZERO);
+        detail.setPayType(order.getPayType());
+        detail.setConfirmStatus(0);
+        detail.setSourceType(order.getSourceType());
+        detail.setStatus(order.getStatus());
+        detail.setOrderType(0);
+        if (CollUtil.isNotEmpty(orderSettings)) {
+            detail.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
+        }
+        detail.setReceiverName(order.getReceiverName());
+        detail.setReceiverPhone(order.getReceiverPhone());
+        detail.setReceiverPostCode(order.getReceiverPostCode());
+        detail.setReceiverProvince(order.getReceiverProvince());
+        detail.setReceiverCity(order.getReceiverCity());
+        detail.setReceiverRegion(order.getReceiverRegion());
+        detail.setReceiverDetailAddress(order.getReceiverDetailAddress());
+        detail.setDeleteStatus(0);
+        detail.setPaymentTime(new Date());
+        detail.setAfterSale(1);
+        detail.setModifyTime(new Date());
+        orderMapper.insert(detail);
+
+        List<OmsOrderItem> orderItemList = new ArrayList<>();
+        // 创建订单详情
+        for (OrderCreate.OrderItem orderItem : order.getOrderItemList()) {
+
+            // 获取商品信息
+            PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(orderItem.getProductSkuId());
+            if (pmsSkuStock == null) {
+                throw new BizException("商品规格不存在");
+            }
+            PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(pmsSkuStock.getProductId());
+
+            if (pmsProduct == null) {
+                throw new BizException("商品不存在");
+            }
+
+            OmsOrderItem omsOrderItem = new OmsOrderItem();
+            omsOrderItem.setOrderId(detail.getId());
+            omsOrderItem.setOrderSn(detail.getOrderSn());
+            omsOrderItem.setProductId(pmsProduct.getId());
+            omsOrderItem.setProductPic(pmsProduct.getPic());
+            omsOrderItem.setProductName(pmsProduct.getName());
+            omsOrderItem.setProductBrand(pmsProduct.getBrandName());
+            omsOrderItem.setProductPrice(pmsProduct.getPrice());
+            omsOrderItem.setProductQuantity(orderItem.getProductQuantity());
+            omsOrderItem.setProductSkuId(pmsSkuStock.getId());
+            omsOrderItem.setProductSkuCode(pmsSkuStock.getSkuCode());
+            omsOrderItem.setProductCategoryId(pmsProduct.getProductCategoryId());
+            omsOrderItem.setPromotionAmount(BigDecimal.ZERO);
+            omsOrderItem.setCouponAmount(BigDecimal.ZERO);
+            omsOrderItem.setIntegrationAmount(BigDecimal.ZERO);
+            omsOrderItem.setRealAmount(orderItem.getRealAmount());
+            omsOrderItem.setProductAttr(pmsSkuStock.getSpData());
+            omsOrderItem.setReturnStatus(-1);
+
+            orderItemList.add(omsOrderItem);
+        }
+
+
+        // 保存数据
+        if (!CollectionUtils.isEmpty(orderItemList)) {
+            omsOrderItemMapper.insertList(orderItemList);
+        }
+        // skuId 数量 map
+        Map<Long, Integer> skuIdMap = orderItemList.stream().collect(Collectors.groupingBy(OmsOrderItem::getProductSkuId,Collectors.summingInt(OmsOrderItem::getProductQuantity)));
+
+        // 如果订单状态是已发货,扣减库存
+        updateSkuStock( skuIdMap, Lists.newArrayList(detail.getId()));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean productUpdateOrderStatus(String orderNo, Integer status) {
+
+        OmsOrder detail = orderMapper.getByOrderSn(orderNo);
+        if (detail == null) {
+            throw new BizException("订单不存在");
+        }
+        if (detail.getStatus() != 1 ) {
+            throw new BizException("当前订单状态不允许修改");
+        }
+        OmsOrder omsOrder = new OmsOrder();
+        omsOrder.setId(detail.getId());
+        omsOrder.setStatus(status);
+        omsOrder.setModifyTime(new Date());
+        orderMapper.updateByPrimaryKeySelective(omsOrder);
+
+
+        return true;
+    }
 }

+ 16 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsBrandServiceImpl.java

@@ -12,9 +12,14 @@ import com.yonge.cooleshow.admin.service.PmsBrandService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 商品品牌管理Service实现类
@@ -107,4 +112,15 @@ public class PmsBrandServiceImpl implements PmsBrandService {
         pmsBrandExample.createCriteria().andIdIn(ids);
         return brandMapper.updateByExampleSelective(pmsBrand, pmsBrandExample);
     }
+
+    @Override
+    public Map<Long, PmsBrand> getMapByIds(List<Long> brandIds) {
+        if (CollectionUtils.isEmpty(brandIds)) {
+            return new HashMap<>();
+        }
+        PmsBrandExample pmsBrandExample = new PmsBrandExample();
+        pmsBrandExample.createCriteria().andIdIn(brandIds);
+        List<PmsBrand> pmsBrands = brandMapper.selectByExample(pmsBrandExample);
+        return pmsBrands.stream().collect(Collectors.toMap(PmsBrand::getId, Function.identity()));
+    }
 }

+ 15 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductCategoryServiceImpl.java

@@ -16,7 +16,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 商品分类管理Service实现类
@@ -134,6 +138,17 @@ public class PmsProductCategoryServiceImpl implements PmsProductCategoryService
         return productCategoryDao.listWithChildren();
     }
 
+    @Override
+    public Map<Long, PmsProductCategory> getMapByIds(List<Long> categoryIds) {
+        if (CollectionUtils.isEmpty(categoryIds)) {
+            return new HashMap<>();
+        }
+        PmsProductCategoryExample example = new PmsProductCategoryExample();
+        example.createCriteria().andIdIn(categoryIds);
+        List<PmsProductCategory> productCategoryList = productCategoryMapper.selectByExample(example);
+        return productCategoryList.stream().collect(Collectors.toMap(PmsProductCategory::getId, Function.identity()));
+    }
+
     /**
      * 根据分类的parentId设置分类的level
      */

+ 180 - 5
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java

@@ -2,29 +2,36 @@ package com.yonge.cooleshow.admin.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import com.github.pagehelper.PageHelper;
+import com.ym.mec.common.dto.PmsProductDto;
+import com.ym.mec.common.dto.PmsProductQueryParamDto;
+import com.ym.mec.common.entity.GoodsSubModel;
+import com.ym.mec.common.entity.GoodsSubStockModel;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
-import com.yonge.cooleshow.admin.dao.*;
+import com.ym.mec.web.WebFeignService;
 import com.yonge.cooleshow.admin.dao.*;
 import com.yonge.cooleshow.admin.dto.HomeStatistical;
 import com.yonge.cooleshow.admin.dto.PmsProductParam;
 import com.yonge.cooleshow.admin.dto.PmsProductQueryParam;
 import com.yonge.cooleshow.admin.dto.PmsProductResult;
+import com.yonge.cooleshow.admin.service.PmsBrandService;
+import com.yonge.cooleshow.admin.service.PmsProductCategoryService;
 import com.yonge.cooleshow.admin.service.PmsProductService;
+import com.yonge.cooleshow.mbg.dto.PmsSkuStockDto;
 import com.yonge.cooleshow.mbg.mapper.*;
 import com.yonge.cooleshow.mbg.model.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -68,6 +75,14 @@ public class PmsProductServiceImpl implements PmsProductService {
     private PmsProductDao productDao;
     @Autowired
     private PmsProductVertifyRecordDao productVertifyRecordDao;
+    @Autowired
+    private WebFeignService webFeignService;
+
+    @Autowired
+    private PmsBrandService brandService;
+
+    @Autowired
+    private PmsProductCategoryService productCategoryService;
 
     @Override
     public int create(PmsProductParam productParam) {
@@ -127,10 +142,76 @@ public class PmsProductServiceImpl implements PmsProductService {
 
     @Override
     public PmsProductResult getUpdateInfo(Long id) {
-        return productDao.getUpdateInfo(id);
+        PmsProductResult updateInfo = productDao.getUpdateInfo(id);
+        updateProductStock(Collections.singletonList(updateInfo));
+        updateProductSkuStock(updateInfo.getSkuStockList());
+
+        return updateInfo;
+    }
+
+
+
+    public List<PmsSkuStock> updateProductSkuStock(List<PmsSkuStock> skuStocks) {
+        if (CollectionUtils.isEmpty(skuStocks)) {
+            return new ArrayList<>();
+        }
+        // 从进货清单中 获取剩余库存数量
+        List<Long> productIds = skuStocks.stream().map(PmsSkuStock::getProductId).distinct().collect(Collectors.toList());
+
+        // 计算库存数据
+        List<PmsSkuStockDto.PmsSkuStockStock> skuStockStocks = skuStockMapper.getSkuStockByProductIds(productIds);
+
+        // Convert to map
+        Map<Long, Map<Long, List<PmsSkuStockDto.PmsSkuStockStock>>> map = skuStockStocks.stream()
+            .collect(Collectors.groupingBy(PmsSkuStockDto.PmsSkuStockStock::getProductId, Collectors.groupingBy(PmsSkuStockDto.PmsSkuStockStock::getId)));
+
+        // Merge
+        for (PmsSkuStock skuStock : skuStocks) {
+            Map<Long, List<PmsSkuStockDto.PmsSkuStockStock>> skuStockStock = map.get(skuStock.getProductId());
+            if (!CollectionUtils.isEmpty(skuStockStock)) {
+                List<PmsSkuStockDto.PmsSkuStockStock> pmsSkuStockStocks = skuStockStock.get(skuStock.getId());
+                if (CollectionUtils.isEmpty(pmsSkuStockStocks)) {
+                    skuStock.setLockStock(0);
+                    skuStock.setStock(0);
+                    continue;
+                }
+                skuStock.setStock(pmsSkuStockStocks.stream().mapToInt(item -> item.getInternalStock() + item.getTaxStock()).sum());
+                skuStock.setLockStock(0);
+            }
+
+        }
+        return skuStocks;
+    }
+
+    public List<PmsProduct> updateProductStock(List<PmsProduct> pmsProducts) {
+        if (CollectionUtils.isEmpty(pmsProducts)) {
+            return new ArrayList<>();
+        }
+        // 从进货清单中 获取剩余库存数量
+        List<Long> productIds = pmsProducts.stream().map(PmsProduct::getId).collect(Collectors.toList());
+
+        // 计算库存数据
+        List<PmsSkuStockDto.PmsSkuStockStock> skuStockStocks = skuStockMapper.getSkuStockByProductIds(productIds);
+
+        // Convert to map
+        Map<Long, List<PmsSkuStockDto.PmsSkuStockStock>> skuStockStockMap = skuStockStocks.stream().collect(Collectors.groupingBy(PmsSkuStockDto.PmsSkuStockStock::getProductId));
+
+        // Merge
+        for (PmsProduct pmsProduct : pmsProducts) {
+            List<PmsSkuStockDto.PmsSkuStockStock> skuStockStock = skuStockStockMap.get(pmsProduct.getId());
+            if (!CollectionUtils.isEmpty(skuStockStock)) {
+                pmsProduct.setStock(skuStockStock.stream().mapToInt(PmsSkuStockDto.PmsSkuStockStock::getInternalStock).sum() + skuStockStock.stream().mapToInt(PmsSkuStockDto.PmsSkuStockStock::getTaxStock).sum());
+                pmsProduct.setLockStock(0);
+            } else {
+                pmsProduct.setStock(0);
+                pmsProduct.setLockStock(0);
+            }
+        }
+        return pmsProducts;
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int update(Long id, PmsProductParam productParam) {
         if (productParam.getPrice().compareTo(BigDecimal.ZERO) <=0 ) {
             throw new BizException("商品价格不能小于等于0");
@@ -186,6 +267,7 @@ public class PmsProductServiceImpl implements PmsProductService {
         List<PmsSkuStock> currSkuList = productParam.getSkuStockList();
         //当前没有sku直接删除
         if(CollUtil.isEmpty(currSkuList)){
+            syncProductStatus(Collections.singletonList(id), 0);
             PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
             skuStockExample.createCriteria().andProductIdEqualTo(id);
             skuStockMapper.deleteByExample(skuStockExample);
@@ -210,6 +292,8 @@ public class PmsProductServiceImpl implements PmsProductService {
         }
         //删除sku
         if(CollUtil.isNotEmpty(removeSkuList)){
+            syncSkuStatus(0, removeSkuList);
+
             List<Long> removeSkuIds = removeSkuList.stream().map(PmsSkuStock::getId).collect(Collectors.toList());
             PmsSkuStockExample removeExample = new PmsSkuStockExample();
             removeExample.createCriteria().andIdIn(removeSkuIds);
@@ -256,6 +340,9 @@ public class PmsProductServiceImpl implements PmsProductService {
 
     @Override
     public int updatePublishStatus(List<Long> ids, Integer publishStatus) {
+
+        syncProductStatus(ids, publishStatus);
+
         PmsProduct record = new PmsProduct();
         record.setPublishStatus(publishStatus);
         PmsProductExample example = new PmsProductExample();
@@ -263,6 +350,33 @@ public class PmsProductServiceImpl implements PmsProductService {
         return productMapper.updateByExampleSelective(record, example);
     }
 
+    private void syncProductStatus(List<Long> ids, Integer publishStatus) {
+
+        // 查询商品的sku
+        PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
+        skuStockExample.createCriteria().andProductIdIn(ids);
+        List<PmsSkuStock> pmsSkuStocks = skuStockMapper.selectByExample(skuStockExample);
+        syncSkuStatus(publishStatus, pmsSkuStocks);
+    }
+
+    private void syncSkuStatus(Integer publishStatus, List<PmsSkuStock> pmsSkuStocks) {
+        if (CollectionUtils.isEmpty(pmsSkuStocks)) {
+            return;
+        }
+        // 商品状态同步
+        List<GoodsSubModel> collect = pmsSkuStocks.stream().map(o -> {
+            GoodsSubModel goodsSubModel = new GoodsSubModel();
+            goodsSubModel.setMallGoodsId(o.getProductId().intValue());
+            goodsSubModel.setSkuId(o.getId().intValue());
+            goodsSubModel.setGoodsStatus(publishStatus == 1);
+            return goodsSubModel;
+        }).collect(Collectors.toList());
+        HttpResponseResult<Boolean> booleanHttpResponseResult = webFeignService.goodsStatusSynchronize(collect);
+        if (booleanHttpResponseResult.getCode() != 200) {
+            throw new BizException("商品状态同步失败");
+        }
+    }
+
     @Override
     public int updateRecommendStatus(List<Long> ids, Integer recommendStatus) {
         PmsProduct record = new PmsProduct();
@@ -283,6 +397,23 @@ public class PmsProductServiceImpl implements PmsProductService {
 
     @Override
     public int updateDeleteStatus(List<Long> ids, Integer deleteStatus) {
+        if (1 == deleteStatus) {
+            syncProductStatus(ids, 0);
+            // 更新库存
+            PmsSkuStockExample example = new PmsSkuStockExample();
+            example.createCriteria().andProductIdIn(ids);
+            List<PmsSkuStock> pmsSkuStocks = skuStockMapper.selectByExample(example);
+            if (!CollectionUtils.isEmpty(pmsSkuStocks)) {
+                List<GoodsSubStockModel> stockModels = pmsSkuStocks.stream().map(next -> {
+                    GoodsSubStockModel stockModel = new GoodsSubStockModel();
+                    stockModel.setMallGoodsId(next.getProductId().intValue());
+                    stockModel.setSku(next.getId().intValue());
+                    stockModel.setStock(0);
+                    return stockModel;
+                }).collect(Collectors.toList());
+                webFeignService.goodsStockCountSynchronize(stockModels);
+            }
+        }
         PmsProduct record = new PmsProduct();
         record.setDeleteStatus(deleteStatus);
         PmsProductExample example = new PmsProductExample();
@@ -314,6 +445,50 @@ public class PmsProductServiceImpl implements PmsProductService {
         return productDao.selectProductShowStatusCount();
     }
 
+    @Override
+    public Map<Long, PmsProduct> getMapByIds(List<Long> productIds) {
+        if (CollectionUtils.isEmpty(productIds)) {
+            return new HashMap<>();
+        }
+        PmsProductExample example = new PmsProductExample();
+        example.createCriteria().andIdIn(productIds);
+        List<PmsProduct> pmsProducts = productMapper.selectByExample(example);
+        return pmsProducts.stream().collect(Collectors.toMap(PmsProduct::getId, pmsProduct -> pmsProduct));
+    }
+
+    @Override
+    public List<PmsProductDto> getFeignProductList(PmsProductQueryParamDto productQueryParam) {
+        PageHelper.startPage(productQueryParam.getPageNum(), productQueryParam.getPageSize());
+        List<PmsProductDto> feignProductList = productDao.getFeignProductList(productQueryParam);
+        if (CollectionUtils.isEmpty(feignProductList)) {
+            return new ArrayList<>();
+        }
+        // 品牌ID集合
+        List<Long> brandIds = feignProductList.stream().map(PmsProductDto::getBrandId).collect(Collectors.toList());
+
+        Map<Long, PmsBrand> brandMap = brandService.getMapByIds(brandIds);
+
+        // 商品分类ID集合
+        List<Long> categoryIds = feignProductList.stream().map(PmsProductDto::getProductCategoryId).collect(Collectors.toList());
+
+        Map<Long, PmsProductCategory> categoryMap = productCategoryService.getMapByIds(categoryIds);
+
+        // merge
+        for (PmsProductDto pmsProductDto : feignProductList) {
+
+            PmsBrand pmsBrand = brandMap.get(pmsProductDto.getBrandId());
+            if (pmsBrand != null) {
+                pmsProductDto.setBrandName(pmsBrand.getName());
+            }
+            PmsProductCategory pmsProductCategory = categoryMap.get(pmsProductDto.getProductCategoryId());
+            if (pmsProductCategory != null) {
+                pmsProductDto.setProductCategoryName(pmsProductCategory.getName());
+            }
+        }
+
+        return feignProductList;
+    }
+
     /**
      * 建立和插入关系表操作
      *

+ 133 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductSkuStockRecordServiceImpl.java

@@ -0,0 +1,133 @@
+package com.yonge.cooleshow.admin.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.github.pagehelper.PageHelper;
+import com.google.common.collect.Lists;
+import com.ym.mec.common.exception.BizException;
+import com.yonge.cooleshow.admin.dao.PmsProductSkuStockRecordDao;
+import com.yonge.cooleshow.admin.service.OmsOrderService;
+import com.yonge.cooleshow.admin.service.PmsProductService;
+import com.yonge.cooleshow.admin.service.PmsProductSkuStockRecordService;
+import com.yonge.cooleshow.admin.service.PmsSkuStockService;
+import com.yonge.cooleshow.admin.wrapper.PmsProductSkuStockRecordWrapper;
+import com.yonge.cooleshow.mbg.mapper.PmsProductMapper;
+import com.yonge.cooleshow.mbg.mapper.PmsProductSkuStockRecordMapper;
+import com.yonge.cooleshow.mbg.mapper.PmsSkuStockMapper;
+import com.yonge.cooleshow.mbg.model.PmsProduct;
+import com.yonge.cooleshow.mbg.model.PmsProductSkuStockRecord;
+import com.yonge.cooleshow.mbg.model.PmsSkuStock;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class PmsProductSkuStockRecordServiceImpl implements PmsProductSkuStockRecordService {
+
+    @Autowired
+    private PmsProductSkuStockRecordMapper pmsProductSkuStockRecordMapper;
+
+    @Autowired
+    private PmsProductSkuStockRecordDao pmsProductSkuStockRecordDao;
+
+    @Autowired
+    private PmsSkuStockService skuStockService;
+
+
+    @Autowired
+    private PmsSkuStockMapper pmsSkuStockMapper;
+
+    @Autowired
+    private PmsProductMapper pmsProductMapper;
+
+    @Autowired
+    private PmsProductService pmsProductService;
+
+    @Autowired
+    private OmsOrderService omsOrderService;
+
+    /**
+     * 列表分页
+     *
+     * @param query
+     */
+    @Override
+    public List<PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord> list(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecordQuery query) {
+        PageHelper.startPage(query.getPageNum(), query.getPageSize());
+        List<PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord> list = pmsProductSkuStockRecordDao.list(query);
+        if (CollectionUtils.isEmpty(list)) {
+            return list;
+        }
+        // sku id 集合
+        List<Long> skuIds = list.stream().map(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord::getProductSkuId).distinct().collect(Collectors.toList());
+
+        // 商品ID 集合
+        List<Long> productIds = list.stream().map(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord::getProductId).distinct().collect(Collectors.toList());
+        // 获取商品信息
+        Map<Long, PmsProduct> productMap = pmsProductService.getMapByIds(productIds);
+
+        Map<Long, PmsSkuStock> skuStockMap = skuStockService.getMapByIds(skuIds);
+        list.forEach(item -> {
+            PmsSkuStock skuStock = skuStockMap.get(item.getProductSkuId());
+            if (skuStock != null) {
+                item.setProductSkuCode(skuStock.getSkuCode());
+            }
+            PmsProduct pmsProduct = productMap.get(item.getProductId());
+            if (pmsProduct != null) {
+                item.setProductName(pmsProduct.getName());
+                item.setProductSn(pmsProduct.getProductSn());
+            }
+        });
+
+        return list;
+
+    }
+
+    /**
+     * 新增
+     *
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int create(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord) {
+
+        //判断商品存在
+        PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(pmsProductSkuStockRecord.getProductId());
+        if (pmsProduct == null) {
+            throw new BizException("商品不存在");
+        }
+        //判断sku存在
+        PmsSkuStock pmsSkuStock = pmsSkuStockMapper.selectByPrimaryKey(pmsProductSkuStockRecord.getProductSkuId());
+        if (pmsSkuStock == null) {
+            throw new BizException("sku不存在");
+        }
+
+        pmsProductSkuStockRecordMapper.insertSelective(JSON.parseObject(JSON.toJSONString(pmsProductSkuStockRecord), PmsProductSkuStockRecord.class));
+
+        // 同步库存数据
+        omsOrderService.syncSkuStock(Lists.newArrayList(pmsProductSkuStockRecord.getProductSkuId()));
+
+        return 1;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int update(PmsProductSkuStockRecordWrapper.PmsProductSkuStockRecord pmsProductSkuStockRecord) {
+        // 没有扣减过库存的记录才能修改
+        if (pmsProductSkuStockRecord.getId() == null) {
+            throw new BizException("批次号不能为空");
+        }
+        int i = pmsProductSkuStockRecordMapper.updateByIdAndStockSelective(JSON.parseObject(JSON.toJSONString(pmsProductSkuStockRecord), PmsProductSkuStockRecord.class));
+        if (i > 0) {
+            // 同步库存数据
+            omsOrderService.syncSkuStock(Lists.newArrayList(pmsProductSkuStockRecord.getProductSkuId()));
+        } else {
+            throw new BizException("修改失败");
+        }
+        return i;
+    }
+}

+ 84 - 2
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsSkuStockServiceImpl.java

@@ -1,15 +1,24 @@
 package com.yonge.cooleshow.admin.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
 import com.yonge.cooleshow.admin.dao.PmsSkuStockDao;
+import com.yonge.cooleshow.admin.wrapper.PmsSkuStockWrapper;
+import com.yonge.cooleshow.mbg.dto.PmsSkuStockDto;
 import com.yonge.cooleshow.mbg.mapper.PmsSkuStockMapper;
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import com.yonge.cooleshow.mbg.model.PmsSkuStockExample;
 import com.yonge.cooleshow.admin.service.PmsSkuStockService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 商品SKU库存管理Service实现类
@@ -23,17 +32,90 @@ public class PmsSkuStockServiceImpl implements PmsSkuStockService {
     private PmsSkuStockDao skuStockDao;
 
     @Override
-    public List<PmsSkuStock> getList(Long pid, String keyword) {
+    public List<PmsSkuStockWrapper.PmsSkuStock> getList(Long pid, String keyword) {
         PmsSkuStockExample example = new PmsSkuStockExample();
         PmsSkuStockExample.Criteria criteria = example.createCriteria().andProductIdEqualTo(pid);
         if (!StringUtils.isEmpty(keyword)) {
             criteria.andSkuCodeLike("%" + keyword + "%");
         }
-        return skuStockMapper.selectByExample(example);
+        List<PmsSkuStock> pmsSkuStocks = skuStockMapper.selectByExample(example);
+        if (CollectionUtils.isEmpty(pmsSkuStocks)) {
+            return new ArrayList<>();
+        }
+
+        // Convert to wrapper
+        List<PmsSkuStockWrapper.PmsSkuStock> stockList = JSON.parseArray(JSON.toJSONString(pmsSkuStocks), PmsSkuStockWrapper.PmsSkuStock.class);
+
+        // 计算库存数据
+        List<PmsSkuStockDto.PmsSkuStockStock> skuStockStocks =  skuStockMapper.getSkuStockByProductIds(Lists.newArrayList(pid));
+
+        // Convert to map
+        Map<Long, PmsSkuStockDto.PmsSkuStockStock> skuStockStockMap = skuStockStocks.stream().collect(Collectors.toMap(PmsSkuStockDto.PmsSkuStockStock::getId, skuStock -> skuStock));
+
+        // Merge
+        for (PmsSkuStockWrapper.PmsSkuStock stock : stockList) {
+            PmsSkuStockDto.PmsSkuStockStock skuStockStock = skuStockStockMap.get(stock.getId());
+            if (skuStockStock != null) {
+                stock.setInternalStock(skuStockStock.getInternalStock());
+                stock.setTaxStock(skuStockStock.getTaxStock());
+            } else {
+                stock.setInternalStock(0);
+                stock.setTaxStock(0);
+            }
+        }
+
+        return stockList;
     }
 
     @Override
     public int update(Long pid, List<PmsSkuStock> skuStockList) {
         return skuStockDao.replaceList(skuStockList);
     }
+
+    @Override
+    public Map<Long, PmsSkuStock> getMapByIds(List<Long> skuIds) {
+        if (CollectionUtils.isEmpty(skuIds)) {
+            return new HashMap<>();
+        }
+        PmsSkuStockExample example = new PmsSkuStockExample();
+        example.createCriteria().andIdIn(skuIds);
+        List<PmsSkuStock> skuStockList = skuStockMapper.selectByExample(example);
+        skuStockList = updateProductSkuStock(skuStockList);
+        if (CollectionUtils.isEmpty(skuStockList)) {
+            return new HashMap<>();
+        }
+        return skuStockList.stream().collect(Collectors.toMap(PmsSkuStock::getId, skuStock -> skuStock));
+    }
+
+    public List<PmsSkuStock> updateProductSkuStock(List<PmsSkuStock> skuStocks) {
+        if (CollectionUtils.isEmpty(skuStocks)) {
+            return new ArrayList<>();
+        }
+        // 从进货清单中 获取剩余库存数量
+        List<Long> productIds = skuStocks.stream().map(PmsSkuStock::getProductId).distinct().collect(Collectors.toList());
+
+        // 计算库存数据
+        List<PmsSkuStockDto.PmsSkuStockStock> skuStockStocks = skuStockMapper.getSkuStockByProductIds(productIds);
+
+        // Convert to map
+        Map<Long, Map<Long, List<PmsSkuStockDto.PmsSkuStockStock>>> map = skuStockStocks.stream()
+            .collect(Collectors.groupingBy(PmsSkuStockDto.PmsSkuStockStock::getProductId, Collectors.groupingBy(PmsSkuStockDto.PmsSkuStockStock::getId)));
+
+        // Merge
+        for (PmsSkuStock skuStock : skuStocks) {
+            Map<Long, List<PmsSkuStockDto.PmsSkuStockStock>> skuStockStock = map.get(skuStock.getProductId());
+            if (!CollectionUtils.isEmpty(skuStockStock)) {
+                List<PmsSkuStockDto.PmsSkuStockStock> pmsSkuStockStocks = skuStockStock.get(skuStock.getId());
+                if (CollectionUtils.isEmpty(pmsSkuStockStocks)) {
+                    skuStock.setLockStock(0);
+                    skuStock.setStock(0);
+                    continue;
+                }
+                skuStock.setStock(pmsSkuStockStocks.stream().mapToInt(item -> item.getInternalStock() + item.getTaxStock()).sum());
+                skuStock.setLockStock(0);
+            }
+
+        }
+        return skuStocks;
+    }
 }

+ 102 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsMemberServiceImpl.java

@@ -0,0 +1,102 @@
+package com.yonge.cooleshow.admin.service.impl;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.common.exception.BizException;
+import com.yonge.cooleshow.admin.service.UmsMemberService;
+import com.yonge.cooleshow.mbg.mapper.UmsMemberLevelMapper;
+import com.yonge.cooleshow.mbg.mapper.UmsMemberMapper;
+import com.yonge.cooleshow.mbg.model.UmsMember;
+import com.yonge.cooleshow.mbg.model.UmsMemberLevel;
+import com.yonge.cooleshow.mbg.model.UmsMemberLevelExample;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 会员管理Service实现类
+ * Created by macro on 2018/8/3.
+ */
+@Service
+public class UmsMemberServiceImpl implements UmsMemberService {
+    private static final Logger LOGGER = LoggerFactory.getLogger(UmsMemberServiceImpl.class);
+
+    @Autowired
+    private UmsMemberMapper memberMapper;
+    @Autowired
+    private UmsMemberLevelMapper memberLevelMapper;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+
+    @Override
+    public UmsMember getById(Long id) {
+        UmsMember umsMember = memberMapper.selectByPrimaryKey(id);
+        if (umsMember == null) {
+            SysUser sysUser = sysUserFeignService.queryUserById(id.intValue());
+            if (sysUser == null || sysUser.getId() == null) {
+                throw new BizException("用户信息获取失败");
+            }
+            umsMember = getUmsMember(sysUser, umsMember);
+        }
+        return umsMember;
+    }
+
+    @Override
+    public UmsMember getCurrentMember() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        UmsMember umsMember = getById(sysUser.getId().longValue());
+        umsMember = getUmsMember(sysUser, umsMember);
+        return umsMember;
+    }
+
+    private UmsMember getUmsMember(SysUser sysUser, UmsMember umsMember) {
+        // 商城库用户不存在-> 创建
+        if (umsMember == null || umsMember.getId() == null) {
+            umsMember = new UmsMember();
+            umsMember.setId(sysUser.getId().longValue());
+            umsMember.setCreateTime(sysUser.getCreateTime());
+            umsMember.setUsername(sysUser.getUsername());
+            umsMember.setPassword(sysUser.getPassword());
+            umsMember.setPhone(sysUser.getPhone());
+            umsMember.setStatus(sysUser.getLockFlag());
+            umsMember.setIcon(sysUser.getAvatar());
+            umsMember.setGender(sysUser.getGender());
+            umsMember.setBirthday(sysUser.getBirthdate());
+            //获取默认会员等级并设置
+            UmsMemberLevelExample levelExample = new UmsMemberLevelExample();
+            levelExample.createCriteria().andDefaultStatusEqualTo(1);
+            List<UmsMemberLevel> memberLevelList = memberLevelMapper.selectByExample(levelExample);
+            if (!CollectionUtils.isEmpty(memberLevelList)) {
+                umsMember.setMemberLevelId(memberLevelList.get(0).getId());
+            }
+            memberMapper.insert(umsMember);
+        } else {
+            boolean flag = false;
+            if (sysUser.getUsername() != null && !sysUser.getUsername().equals(umsMember.getUsername())) {
+                umsMember.setUsername(sysUser.getUsername());
+                flag = true;
+            }
+            if (sysUser.getPhone() != null && !sysUser.getPhone().equals(umsMember.getUsername())) {
+                umsMember.setPhone(sysUser.getPhone());
+                flag = true;
+            }
+            if (sysUser.getAvatar() != null && !sysUser.getAvatar().equals(umsMember.getIcon())) {
+                umsMember.setIcon(sysUser.getAvatar());
+                flag = true;
+            }
+            if (flag) {
+                memberMapper.updateByPrimaryKeySelective(umsMember);
+            }
+        }
+        return umsMember;
+    }
+
+}

+ 157 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsProductSkuStockRecordWrapper.java

@@ -0,0 +1,157 @@
+package com.yonge.cooleshow.admin.wrapper;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.DateTimeFormat;
+import com.alibaba.excel.annotation.format.NumberFormat;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public class PmsProductSkuStockRecordWrapper {
+
+
+    @Data
+    @ApiModel("PmsProductSkuStockRecordQuery-商品库存入库记录")
+    public static class PmsProductSkuStockRecordQuery {
+
+        @ApiModelProperty("当前页")
+        private Integer pageNum =1;
+
+        @ApiModelProperty("分页行数")
+        private Integer pageSize =10;
+
+        @ApiModelProperty(value = "商品ID",required = true)
+        @NotNull(message = "商品ID不能为空")
+        private Long productId;
+
+        @ApiModelProperty("批次号")
+        private String id;
+
+        @ApiModelProperty("备查货号")
+        private String selectProductSn;
+
+        @ApiModelProperty("入库开始时间")
+        private Date startTime;
+
+        @ApiModelProperty("入库结束时间")
+        private Date endTime;
+
+        private List<Long> productIds;
+
+    }
+
+
+
+    @Data
+    @ApiModel("PmsProductSkuStockRecord-商品库存入库记录")
+    public static class PmsProductSkuStockRecord {
+        /**
+         * id,批次号
+         */
+        @ApiModelProperty("批次号")
+
+        @ExcelProperty(value = "批次号",order = 1)
+        @ColumnWidth(20)
+        private Long id;
+
+        /**
+         * 商品ID
+         */
+        @ApiModelProperty("商品ID")
+        @NotNull(message = "商品ID不能为空")
+        @ExcelIgnore
+        private Long productId;
+
+        @ApiModelProperty("商品货号")
+        @ExcelProperty(value = "商品货号",order = 2)
+        private String productSn;
+
+
+        @ApiModelProperty("商品名称")
+        @ExcelProperty(value = "商品名称",order = 2)
+        private String productName;
+
+        /**
+         * 商品skuId
+         */
+        @ApiModelProperty("商品skuId")
+        @NotNull(message = "商品skuId不能为空")
+        @ExcelIgnore
+        private Long productSkuId;
+
+
+        /**
+         * 商品skuId
+         */
+        @ApiModelProperty("商品sku编号")
+        @ExcelProperty(value = "sku编号",order = 3)
+        private String productSkuCode;
+
+        /**
+         * 备查货号
+         */
+        @ApiModelProperty("备查货号")
+        @NotNull(message = "备查货号不能为空")
+        @ExcelProperty(value = "备查货号",order = 2)
+        private String selectProductSn;
+
+        /**
+         * 内部库存
+         */
+        @ApiModelProperty("内部库存")
+        @NotNull(message = "内部库存不能为空")
+        @ExcelProperty(value = "内部库存",order = 4)
+        private Integer internalStock;
+
+        /**
+         * 内部销售库存
+         */
+        @ApiModelProperty("内部销售库存")
+        @ExcelProperty(value = "内部销售库存",order = 5)
+        private Integer internalSaleStock;
+
+        /**
+         * 税务库存
+         */
+        @ApiModelProperty("税务库存")
+        @NotNull(message = "税务库存不能为空")
+        @ExcelProperty(value = "税务库存",order = 6)
+        private Integer taxStock;
+
+        /**
+         * 税务库存
+         */
+        @ApiModelProperty("税务销售库存")
+        @ExcelProperty(value = "税务销售库存",order = 7)
+        private Integer taxSaleStock;
+
+        /**
+         * 采购价
+         */
+        @ApiModelProperty("采购价")
+        @NotNull(message = "采购价不能为空")
+        @ExcelProperty(value = "采购价",order = 8)
+//        @NumberFormat("#.##")
+        private BigDecimal price;
+
+
+        /**
+         * 创建时间
+         */
+        @ApiModelProperty("创建时间")
+        @ColumnWidth(30)
+        @ExcelProperty(value = "创建时间",order = 9)
+        @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
+        private Date createTime;
+
+        @ExcelIgnore
+        private Long createBy;
+    }
+}

+ 37 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsProductWrapper.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.admin.wrapper;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+public class PmsProductWrapper {
+
+    @Data
+    @ApiModel("商品导出数据")
+    public static class PmsProductExport {
+        @ExcelProperty("商品编号")
+        private Long id;
+
+        @ExcelProperty("商品货号")
+        private String productSn;
+
+        @ExcelProperty("商品名称")
+        private String name;
+
+        @ExcelProperty("品牌")
+        private String brandName;
+
+
+        /**
+         * 内部库存
+         */
+        @ExcelProperty(value = "内部剩余库存")
+        private Integer internalStock;
+
+        /**
+         * 税务库存
+         */
+        @ExcelProperty(value = "税务剩余库存")
+        private Integer taxStock;
+    }
+}

+ 57 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/wrapper/PmsSkuStockWrapper.java

@@ -0,0 +1,57 @@
+package com.yonge.cooleshow.admin.wrapper;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+public class PmsSkuStockWrapper {
+
+    @Data
+    @ApiModel("PmsSkuStock-sku管理")
+    public static class PmsSkuStock {
+        @ApiModelProperty(value = "sku库存表id")
+        private Long id;
+
+        @ApiModelProperty(value = "商品id")
+        private Long productId;
+
+        @ApiModelProperty(value = "sku编码")
+        private String skuCode;
+
+        private BigDecimal price;
+
+        /**
+         * 内部库存
+         */
+        @ApiModelProperty("内部库存")
+        private Integer internalStock;
+
+        /**
+         * 税务库存
+         */
+        @ApiModelProperty("税务库存")
+        private Integer taxStock;
+
+        @ApiModelProperty(value = "预警库存")
+        private Integer lowStock;
+
+        @ApiModelProperty(value = "展示图片")
+        private String pic;
+
+        @ApiModelProperty(value = "销量")
+        private Integer sale;
+
+        @ApiModelProperty(value = "单品促销价格")
+        private BigDecimal promotionPrice;
+
+
+        @ApiModelProperty(value = "商品销售属性,json格式")
+        private String spData;
+    }
+
+
+}

+ 12 - 0
mec-mall/mall-admin/src/main/resources/bootstrap-dev.properties

@@ -0,0 +1,12 @@
+spring.cloud.nacos.config.server-addr=10.206.0.17:8848
+#\u9ED8\u8BA4\u4E3APublic\u547D\u540D\u7A7A\u95F4,\u53EF\u4EE5\u7701\u7565\u4E0D\u5199
+spring.cloud.nacos.config.namespace=470509f8-ea21-42cb-9c64-924c5ccc68ce
+#\u6307\u5B9A\u914D\u7F6E\u7FA4\u7EC4 --\u5982\u679C\u662FPublic\u547D\u540D\u7A7A\u95F4 \u5219\u53EF\u4EE5\u7701\u7565\u7FA4\u7EC4\u914D\u7F6E
+spring.cloud.nacos.config.group=DEFAULT_GROUP
+#\u6587\u4EF6\u540D -- \u5982\u679C\u6CA1\u6709\u914D\u7F6E\u5219\u9ED8\u8BA4\u4E3A ${spring.appliction.name}
+spring.cloud.nacos.config.prefix=mall-admin
+#\u6307\u5B9A\u6587\u4EF6\u540E\u7F00
+spring.cloud.nacos.config.file-extension=yaml
+#\u662F\u5426\u52A8\u6001\u5237\u65B0
+spring.cloud.nacos.config.enabled=true
+logging.config=classpath:logback-dev.xml

+ 48 - 3
mec-mall/mall-admin/src/main/resources/config/mybatis/PmsProductDao.xml

@@ -74,7 +74,9 @@
             left join
             (select DISTINCT pss.product_id
             from  pms_sku_stock pss
-            where pss.stock &lt;= pss.low_stock) b
+            left join pms_product_sku_stock_record t3 on t3.product_sku_id= pss.id
+            group by pss.product_id,pss.id,pss.low_stock
+            having sum(t3.internal_stock - t3.internal_sale_stock) &lt;= pss.low_stock) b
             on b.product_id = pp.id
         </if>
 
@@ -99,12 +101,55 @@
                 and pp.product_category_id = #{param.productCategoryId}
             </if>
             <if test="param.stock == 1">
-                and (pp.stock &lt;= pp.low_stock or b.product_id is not null)
+                and ( b.product_id is not null)
             </if>
             <if test="param.stock == 0">
-                and (pp.stock &gt; pp.low_stock and b.product_id is null)
+                and (b.product_id is null)
             </if>
         </where>
         order by pp.sort desc,pp.id desc
     </select>
+
+    <select id="getFeignProductList" resultType="com.ym.mec.common.dto.PmsProductDto">
+        select t1.id as skuStockId,
+        t.id as goodsId,
+        t1.sku_code as skuCode,
+        t.name as name,
+        t.product_sn as productSn,
+        t.delete_status as deleteStatus,
+        t.publish_status as publishStatus,
+        t1.price as price,
+        t.brand_id as brandId,
+        t.product_category_id as productCategoryId,
+        t1.sp_data as spData
+        from pms_product t
+        left join pms_sku_stock t1 on t.id = t1.product_id
+        <where>
+            t.delete_status = 0
+            <if test="param.publishStatus != null">
+                and t.publish_status = #{param.publishStatus}
+            </if>
+            <if test="param.skuStockIds != null and param.skuStockIds != ''">
+                and find_in_set(t1.id,#{param.skuStockIds})
+            </if>
+            <if test="param.keyword != null and param.keyword != ''">
+                and (t.name like concat('%',#{param.keyword},'%') )
+            </if>
+            <if test="param.productSn != null and param.productSn != ''">
+                and t.product_sn like concat('%',#{param.productSn},'%')
+            </if>
+            <if test="param.brandId != null">
+                and t.brand_id = #{param.brandId}
+            </if>
+            <if test="param.productCategoryId != null">
+                and t.product_category_id = #{param.productCategoryId}
+            </if>
+            <if test="param.productIds != null and param.productIds != ''">
+                and find_in_set(t.id,#{param.productIds})
+            </if>
+            <if test="param.excludeProductIds != null and param.excludeProductIds != ''">
+                and find_in_set(t.id,#{param.excludeProductIds}) = 0
+            </if>
+        </where>
+    </select>
 </mapper>

+ 37 - 0
mec-mall/mall-admin/src/main/resources/config/mybatis/PmsProductSkuStockRecordDao.xml

@@ -0,0 +1,37 @@
+<?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.yonge.cooleshow.admin.dao.PmsProductSkuStockRecordDao">
+
+    <select id="list"
+            resultType="com.yonge.cooleshow.admin.wrapper.PmsProductSkuStockRecordWrapper$PmsProductSkuStockRecord">
+
+        SELECT
+        distinct t.*
+        FROM pms_product_sku_stock_record t
+        <where>
+            <if test="param.productId != null">
+                AND t.product_id = #{param.productId}
+            </if>
+            <if test="param.id != null and param.id != ''">
+                and t.id like concat('%',#{param.id},'%')
+            </if>
+            <if test="param.selectProductSn != null and param.selectProductSn != ''">
+                and t.select_product_sn like concat('%',#{param.selectProductSn},'%')
+            </if>
+            <if test="param.startTime != null">
+                and t.create_time &gt;= #{param.startTime}
+            </if>
+            <if test="param.endTime != null">
+                and t.create_time &lt;= #{param.endTime}
+            </if>
+            <if test="param.productIds != null and param.productIds.size() != 0">
+                and t.product_id in
+                <foreach collection="param.productIds" item="productId" open="(" separator="," close=")">
+                    #{productId}
+                </foreach>
+            </if>
+
+        </where>
+
+    </select>
+</mapper>

+ 1 - 0
mec-mall/mall-admin/src/main/resources/config/mybatis/PmsSkuStockDao.xml

@@ -28,4 +28,5 @@
             #{item.spData,jdbcType=VARCHAR})
         </foreach>
     </insert>
+
 </mapper>

+ 25 - 0
mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/exception/GlobalExceptionHandler.java

@@ -2,12 +2,17 @@ package com.yonge.cooleshow.mall.common.exception;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.microsvc.toolkit.common.response.enums.ESysMap;
+import com.microsvc.toolkit.common.response.template.R;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.util.http.HttpUtil;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 import org.springframework.validation.BindException;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.FieldError;
@@ -127,6 +132,26 @@ public class GlobalExceptionHandler {
         }
     }
 
+
+    /**
+     * 默认异常信息
+     * @param ex Exception
+     * @return ResponseEntity<JSONObject>
+     */
+    @ResponseBody
+    @ExceptionHandler(Throwable.class)
+    public CommonResult defaultExceptionMapper(Throwable ex) {
+
+        Throwable throwable = getThrowable(ex);
+        log.error("defaultExceptionMapper ", throwable);
+
+        // dingTalk机器人通知
+        sendDingTalkRobotNotify(throwable);
+
+        return  CommonResult.failed("系统异常");
+    }
+
+
     /**
      * 请求日志
      * @param request HttpServletRequest

+ 32 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/dto/PmsSkuStockDto.java

@@ -0,0 +1,32 @@
+package com.yonge.cooleshow.mbg.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+public class PmsSkuStockDto {
+
+
+    @Data
+    @ApiModel("PmsSkuStock-sku管理")
+    public static class PmsSkuStockStock {
+        @ApiModelProperty(value = "sku库存表id")
+        private Long id;
+
+        @ApiModelProperty(value = "商品id")
+        private Long productId;
+
+        /**
+         * 内部库存
+         */
+        @ApiModelProperty("内部库存")
+        private Integer internalStock;
+
+        /**
+         * 税务库存
+         */
+        @ApiModelProperty("税务库存")
+        private Integer taxStock;
+
+    }
+}

+ 5 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderItemMapper.java

@@ -27,4 +27,9 @@ public interface OmsOrderItemMapper {
     int updateByPrimaryKeySelective(OmsOrderItem record);
 
     int updateByPrimaryKey(OmsOrderItem record);
+
+    /**
+     * 批量插入
+     */
+    int insertList(@Param("list") List<OmsOrderItem> list);
 }

+ 3 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderMapper.java

@@ -27,4 +27,7 @@ public interface OmsOrderMapper {
     int updateByPrimaryKeySelective(OmsOrder record);
 
     int updateByPrimaryKey(OmsOrder record);
+
+
+    OmsOrder getByOrderSn(String orderNo);
 }

+ 35 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductSkuStockRecordMapper.java

@@ -0,0 +1,35 @@
+package com.yonge.cooleshow.mbg.mapper;
+
+import java.util.List;
+
+import com.yonge.cooleshow.mbg.model.PmsProductSkuStockRecord;
+import com.yonge.cooleshow.mbg.model.PmsProductSkuStockRecordExample;
+import org.apache.ibatis.annotations.Param;
+
+public interface PmsProductSkuStockRecordMapper {
+    long countByExample(PmsProductSkuStockRecordExample example);
+
+    int deleteByExample(PmsProductSkuStockRecordExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(PmsProductSkuStockRecord record);
+
+    int insertSelective(PmsProductSkuStockRecord record);
+
+    List<PmsProductSkuStockRecord> selectByExample(PmsProductSkuStockRecordExample example);
+
+    PmsProductSkuStockRecord selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") PmsProductSkuStockRecord record, @Param("example") PmsProductSkuStockRecordExample example);
+
+    int updateByExample(@Param("record") PmsProductSkuStockRecord record, @Param("example") PmsProductSkuStockRecordExample example);
+
+    int updateByPrimaryKeySelective(PmsProductSkuStockRecord record);
+
+    int updateByPrimaryKey(PmsProductSkuStockRecord record);
+
+    void lockStock(@Param("stockRecordIds") List<Long> stockRecordIds);
+
+    int updateByIdAndStockSelective( PmsProductSkuStockRecord pmsProductSkuStockRecord);
+}

+ 2 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsSkuStockMapper.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.mbg.mapper;
 
+import com.yonge.cooleshow.mbg.dto.PmsSkuStockDto;
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import com.yonge.cooleshow.mbg.model.PmsSkuStockExample;
 
@@ -39,4 +40,5 @@ public interface PmsSkuStockMapper {
      */
     int lockStock(@Param("productSkuId") Long productSkuId, @Param("quantity") Integer quantity);
 
+    List<PmsSkuStockDto.PmsSkuStockStock> getSkuStockByProductIds(@Param("productIds") List<Long> productIds);
 }

+ 22 - 1
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrder.java

@@ -11,11 +11,17 @@ public class OmsOrder implements Serializable {
 
     private Long memberId;
 
+    private String orchestraId;
+
     private String couponId;
 
     @ApiModelProperty("下单平台 STUDENT TEACHER")
     private String platformType;
 
+
+    @ApiModelProperty(value = "订单来源 ")
+    private String orderFormType;
+
     @ApiModelProperty(value = "订单编号")
     private String orderSn;
 
@@ -52,7 +58,7 @@ public class OmsOrder implements Serializable {
     @ApiModelProperty(value = "支付方式:0->未支付;1->支付宝;2->微信")
     private Integer payType;
 
-    @ApiModelProperty(value = "订单来源:0->PC订单;1->app订单")
+    @ApiModelProperty(value = "订单来源:0->PC订单;1->app订单 2->学校订单")
     private Integer sourceType;
 
     @ApiModelProperty(value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单")
@@ -147,6 +153,21 @@ public class OmsOrder implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    public String getOrchestraId() {
+        return orchestraId;
+    }
+
+    public void setOrchestraId(String orchestraId) {
+        this.orchestraId = orchestraId;
+    }
+
+    public String getOrderFormType() {
+        return orderFormType;
+    }
+
+    public void setOrderFormType(String orderFormType) {
+        this.orderFormType = orderFormType;
+    }
 
     public int getAfterSale() {
         return afterSale;

+ 66 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsProductSkuStockRecord.java

@@ -0,0 +1,66 @@
+package com.yonge.cooleshow.mbg.model;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 商品库存入库记录
+ */
+@Data
+public class PmsProductSkuStockRecord {
+    /**
+    * id,批次号
+    */
+    private Long id;
+
+    /**
+    * 商品ID
+    */
+    private Long productId;
+
+    /**
+    * 商品skuId
+    */
+    private Long productSkuId;
+
+    /**
+    * 备查货号
+    */
+    private String selectProductSn;
+
+    /**
+    * 内部库存
+    */
+    private Integer internalStock;
+
+    /**
+    * 内部销售库存
+    */
+    private Integer internalSaleStock;
+
+    /**
+    * 税务库存
+    */
+    private Integer taxStock;
+
+    /**
+    * 税务库存
+    */
+    private Integer taxSaleStock;
+
+    /**
+    * 采购价
+    */
+    private BigDecimal price;
+
+    /**
+    * 创建时间
+    */
+    private Date createTime;
+
+    /**
+    * 创建人
+    */
+    private Long createBy;
+}

+ 872 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsProductSkuStockRecordExample.java

@@ -0,0 +1,872 @@
+package com.yonge.cooleshow.mbg.model;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class PmsProductSkuStockRecordExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public PmsProductSkuStockRecordExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdIsNull() {
+            addCriterion("product_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdIsNotNull() {
+            addCriterion("product_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdEqualTo(Long value) {
+            addCriterion("product_id =", value, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdNotEqualTo(Long value) {
+            addCriterion("product_id <>", value, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdGreaterThan(Long value) {
+            addCriterion("product_id >", value, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("product_id >=", value, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdLessThan(Long value) {
+            addCriterion("product_id <", value, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdLessThanOrEqualTo(Long value) {
+            addCriterion("product_id <=", value, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdIn(List<Long> values) {
+            addCriterion("product_id in", values, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdNotIn(List<Long> values) {
+            addCriterion("product_id not in", values, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdBetween(Long value1, Long value2) {
+            addCriterion("product_id between", value1, value2, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductIdNotBetween(Long value1, Long value2) {
+            addCriterion("product_id not between", value1, value2, "productId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdIsNull() {
+            addCriterion("product_sku_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdIsNotNull() {
+            addCriterion("product_sku_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdEqualTo(Long value) {
+            addCriterion("product_sku_id =", value, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdNotEqualTo(Long value) {
+            addCriterion("product_sku_id <>", value, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdGreaterThan(Long value) {
+            addCriterion("product_sku_id >", value, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("product_sku_id >=", value, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdLessThan(Long value) {
+            addCriterion("product_sku_id <", value, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdLessThanOrEqualTo(Long value) {
+            addCriterion("product_sku_id <=", value, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdIn(List<Long> values) {
+            addCriterion("product_sku_id in", values, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdNotIn(List<Long> values) {
+            addCriterion("product_sku_id not in", values, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdBetween(Long value1, Long value2) {
+            addCriterion("product_sku_id between", value1, value2, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProductSkuIdNotBetween(Long value1, Long value2) {
+            addCriterion("product_sku_id not between", value1, value2, "productSkuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnIsNull() {
+            addCriterion("select_product_sn is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnIsNotNull() {
+            addCriterion("select_product_sn is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnEqualTo(String value) {
+            addCriterion("select_product_sn =", value, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnNotEqualTo(String value) {
+            addCriterion("select_product_sn <>", value, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnGreaterThan(String value) {
+            addCriterion("select_product_sn >", value, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnGreaterThanOrEqualTo(String value) {
+            addCriterion("select_product_sn >=", value, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnLessThan(String value) {
+            addCriterion("select_product_sn <", value, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnLessThanOrEqualTo(String value) {
+            addCriterion("select_product_sn <=", value, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnLike(String value) {
+            addCriterion("select_product_sn like", value, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnNotLike(String value) {
+            addCriterion("select_product_sn not like", value, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnIn(List<String> values) {
+            addCriterion("select_product_sn in", values, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnNotIn(List<String> values) {
+            addCriterion("select_product_sn not in", values, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnBetween(String value1, String value2) {
+            addCriterion("select_product_sn between", value1, value2, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andSelectProductSnNotBetween(String value1, String value2) {
+            addCriterion("select_product_sn not between", value1, value2, "selectProductSn");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockIsNull() {
+            addCriterion("internal_stock is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockIsNotNull() {
+            addCriterion("internal_stock is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockEqualTo(Integer value) {
+            addCriterion("internal_stock =", value, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockNotEqualTo(Integer value) {
+            addCriterion("internal_stock <>", value, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockGreaterThan(Integer value) {
+            addCriterion("internal_stock >", value, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockGreaterThanOrEqualTo(Integer value) {
+            addCriterion("internal_stock >=", value, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockLessThan(Integer value) {
+            addCriterion("internal_stock <", value, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockLessThanOrEqualTo(Integer value) {
+            addCriterion("internal_stock <=", value, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockIn(List<Integer> values) {
+            addCriterion("internal_stock in", values, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockNotIn(List<Integer> values) {
+            addCriterion("internal_stock not in", values, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockBetween(Integer value1, Integer value2) {
+            addCriterion("internal_stock between", value1, value2, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalStockNotBetween(Integer value1, Integer value2) {
+            addCriterion("internal_stock not between", value1, value2, "internalStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockIsNull() {
+            addCriterion("internal_sale_stock is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockIsNotNull() {
+            addCriterion("internal_sale_stock is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockEqualTo(Integer value) {
+            addCriterion("internal_sale_stock =", value, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockNotEqualTo(Integer value) {
+            addCriterion("internal_sale_stock <>", value, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockGreaterThan(Integer value) {
+            addCriterion("internal_sale_stock >", value, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockGreaterThanOrEqualTo(Integer value) {
+            addCriterion("internal_sale_stock >=", value, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockLessThan(Integer value) {
+            addCriterion("internal_sale_stock <", value, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockLessThanOrEqualTo(Integer value) {
+            addCriterion("internal_sale_stock <=", value, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockIn(List<Integer> values) {
+            addCriterion("internal_sale_stock in", values, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockNotIn(List<Integer> values) {
+            addCriterion("internal_sale_stock not in", values, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockBetween(Integer value1, Integer value2) {
+            addCriterion("internal_sale_stock between", value1, value2, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andInternalSaleStockNotBetween(Integer value1, Integer value2) {
+            addCriterion("internal_sale_stock not between", value1, value2, "internalSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockIsNull() {
+            addCriterion("tax_stock is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockIsNotNull() {
+            addCriterion("tax_stock is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockEqualTo(Integer value) {
+            addCriterion("tax_stock =", value, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockNotEqualTo(Integer value) {
+            addCriterion("tax_stock <>", value, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockGreaterThan(Integer value) {
+            addCriterion("tax_stock >", value, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockGreaterThanOrEqualTo(Integer value) {
+            addCriterion("tax_stock >=", value, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockLessThan(Integer value) {
+            addCriterion("tax_stock <", value, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockLessThanOrEqualTo(Integer value) {
+            addCriterion("tax_stock <=", value, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockIn(List<Integer> values) {
+            addCriterion("tax_stock in", values, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockNotIn(List<Integer> values) {
+            addCriterion("tax_stock not in", values, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockBetween(Integer value1, Integer value2) {
+            addCriterion("tax_stock between", value1, value2, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxStockNotBetween(Integer value1, Integer value2) {
+            addCriterion("tax_stock not between", value1, value2, "taxStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockIsNull() {
+            addCriterion("tax_sale_stock is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockIsNotNull() {
+            addCriterion("tax_sale_stock is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockEqualTo(Integer value) {
+            addCriterion("tax_sale_stock =", value, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockNotEqualTo(Integer value) {
+            addCriterion("tax_sale_stock <>", value, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockGreaterThan(Integer value) {
+            addCriterion("tax_sale_stock >", value, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockGreaterThanOrEqualTo(Integer value) {
+            addCriterion("tax_sale_stock >=", value, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockLessThan(Integer value) {
+            addCriterion("tax_sale_stock <", value, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockLessThanOrEqualTo(Integer value) {
+            addCriterion("tax_sale_stock <=", value, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockIn(List<Integer> values) {
+            addCriterion("tax_sale_stock in", values, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockNotIn(List<Integer> values) {
+            addCriterion("tax_sale_stock not in", values, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockBetween(Integer value1, Integer value2) {
+            addCriterion("tax_sale_stock between", value1, value2, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxSaleStockNotBetween(Integer value1, Integer value2) {
+            addCriterion("tax_sale_stock not between", value1, value2, "taxSaleStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNull() {
+            addCriterion("price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNotNull() {
+            addCriterion("price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceEqualTo(BigDecimal value) {
+            addCriterion("price =", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotEqualTo(BigDecimal value) {
+            addCriterion("price <>", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThan(BigDecimal value) {
+            addCriterion("price >", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("price >=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThan(BigDecimal value) {
+            addCriterion("price <", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("price <=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIn(List<BigDecimal> values) {
+            addCriterion("price in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotIn(List<BigDecimal> values) {
+            addCriterion("price not in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("price between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("price not between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByIsNull() {
+            addCriterion("create_by is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByIsNotNull() {
+            addCriterion("create_by is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByEqualTo(Long value) {
+            addCriterion("create_by =", value, "createBy");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByNotEqualTo(Long value) {
+            addCriterion("create_by <>", value, "createBy");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByGreaterThan(Long value) {
+            addCriterion("create_by >", value, "createBy");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByGreaterThanOrEqualTo(Long value) {
+            addCriterion("create_by >=", value, "createBy");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByLessThan(Long value) {
+            addCriterion("create_by <", value, "createBy");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByLessThanOrEqualTo(Long value) {
+            addCriterion("create_by <=", value, "createBy");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByIn(List<Long> values) {
+            addCriterion("create_by in", values, "createBy");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByNotIn(List<Long> values) {
+            addCriterion("create_by not in", values, "createBy");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByBetween(Long value1, Long value2) {
+            addCriterion("create_by between", value1, value2, "createBy");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateByNotBetween(Long value1, Long value2) {
+            addCriterion("create_by not between", value1, value2, "createBy");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 2 - 2
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsSkuStock.java

@@ -14,7 +14,7 @@ public class PmsSkuStock implements Serializable {
 
     private BigDecimal price;
 
-    @ApiModelProperty(value = "库存")
+    @ApiModelProperty(value = "库存 弃用 库存从进货清单中计算")
     private Integer stock;
 
     @ApiModelProperty(value = "预警库存")
@@ -29,7 +29,7 @@ public class PmsSkuStock implements Serializable {
     @ApiModelProperty(value = "单品促销价格")
     private BigDecimal promotionPrice;
 
-    @ApiModelProperty(value = "锁定库存")
+    @ApiModelProperty(value = "锁定库存 弃用 不在锁定库存 库存在发货时扣减")
     private Integer lockStock;
 
     @ApiModelProperty(value = "商品销售属性,json格式")

+ 19 - 0
mec-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderItemMapper.xml

@@ -509,4 +509,23 @@
       product_attr = #{productAttr,jdbcType=VARCHAR}
     where id = #{id,jdbcType=BIGINT}
   </update>
+
+        <insert id="insertList">
+            insert into oms_order_item (order_id, order_sn, product_id,
+            product_pic, product_name, product_brand,
+            product_sn, product_price, product_quantity,
+            product_sku_id, product_category_id, product_sku_code,promotion_name,
+            promotion_amount, coupon_amount, integration_amount,
+            real_amount,product_attr,promoter_id,share_proportion_,precision_amount) values
+            <foreach collection="list" item="item" separator="," index="index">
+                (#{item.orderId,jdbcType=BIGINT}, #{item.orderSn,jdbcType=VARCHAR}, #{item.productId,jdbcType=BIGINT},
+                #{item.productPic,jdbcType=VARCHAR}, #{item.productName,jdbcType=VARCHAR}, #{item.productBrand,jdbcType=VARCHAR},
+                #{item.productSn,jdbcType=VARCHAR}, #{item.productPrice,jdbcType=DECIMAL}, #{item.productQuantity,jdbcType=INTEGER},
+                #{item.productSkuId,jdbcType=BIGINT}, #{item.productCategoryId,jdbcType=BIGINT}, #{item.productSkuCode,jdbcType=VARCHAR},
+                #{item.promotionName,jdbcType=VARCHAR},
+                #{item.promotionAmount,jdbcType=DECIMAL}, #{item.couponAmount,jdbcType=DECIMAL},
+                #{item.integrationAmount,jdbcType=DECIMAL},
+                #{item.realAmount,jdbcType=DECIMAL},#{item.productAttr,jdbcType=VARCHAR},#{item.promoterId},#{item.shareProportion},#{item.precisionAmount})
+            </foreach>
+        </insert>
 </mapper>

+ 41 - 3
mec-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderMapper.xml

@@ -4,6 +4,7 @@
   <resultMap id="BaseResultMap" type="com.yonge.cooleshow.mbg.model.OmsOrder">
     <id column="id" jdbcType="BIGINT" property="id" />
     <result column="member_id" jdbcType="BIGINT" property="memberId" />
+    <result column="orchestra_id" jdbcType="BIGINT" property="orchestraId" />
     <result column="coupon_id" property="couponId" />
     <result column="order_sn" jdbcType="VARCHAR" property="orderSn" />
     <result column="cart_ids" jdbcType="VARCHAR" property="cartIds" />
@@ -48,6 +49,7 @@
     <result column="comment_time" jdbcType="TIMESTAMP" property="commentTime" />
     <result column="modify_time" jdbcType="TIMESTAMP" property="modifyTime" />
     <result column="platform_type" jdbcType="TIMESTAMP" property="platformType" />
+    <result column="order_form_type" jdbcType="TIMESTAMP" property="orderFormType" />
     <result column="after_sale"  property="afterSale" />
   </resultMap>
   <sql id="Example_Where_Clause">
@@ -115,7 +117,7 @@
     integration, growth, promotion_info, bill_type, bill_header, bill_content, bill_receiver_phone, 
     bill_receiver_email, receiver_name, receiver_phone, receiver_post_code, receiver_province, 
     receiver_city, receiver_region, receiver_detail_address, note, confirm_status, delete_status, 
-    use_integration, payment_time, delivery_time, receive_time, comment_time, modify_time,cart_ids,platform_type,after_sale
+    use_integration, payment_time, delivery_time, receive_time, comment_time, modify_time,cart_ids,platform_type,after_sale,orchestra_id,order_form_type
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderExample" resultMap="BaseResultMap">
     select
@@ -165,7 +167,7 @@
       receiver_detail_address, note, confirm_status, 
       delete_status, use_integration, payment_time, 
       delivery_time, receive_time, comment_time, 
-      modify_time,cart_ids,platform_type,after_sale)
+      modify_time,cart_ids,platform_type,after_sale,orchestra_id,order_form_type
     values (#{memberId,jdbcType=BIGINT}, #{couponId}, #{orderSn,jdbcType=VARCHAR},
       #{createTime,jdbcType=TIMESTAMP}, #{memberUsername,jdbcType=VARCHAR}, #{totalAmount,jdbcType=DECIMAL}, 
       #{payAmount,jdbcType=DECIMAL}, #{freightAmount,jdbcType=DECIMAL}, #{promotionAmount,jdbcType=DECIMAL}, 
@@ -180,7 +182,7 @@
       #{receiverDetailAddress,jdbcType=VARCHAR}, #{note,jdbcType=VARCHAR}, #{confirmStatus,jdbcType=INTEGER}, 
       #{deleteStatus,jdbcType=INTEGER}, #{useIntegration,jdbcType=INTEGER}, #{paymentTime,jdbcType=TIMESTAMP}, 
       #{deliveryTime,jdbcType=TIMESTAMP}, #{receiveTime,jdbcType=TIMESTAMP}, #{commentTime,jdbcType=TIMESTAMP}, 
-      #{modifyTime,jdbcType=TIMESTAMP},#{cartIds},#{platformType},#{afterSale})
+      #{modifyTime,jdbcType=TIMESTAMP},#{cartIds},#{platformType},#{afterSale},#{orchestraId},#{orderFormType})
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.OmsOrder">
     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
@@ -326,6 +328,12 @@
       <if test="afterSale != null">
         after_sale,
       </if>
+        <if test="orchestraId != null">
+            orchestra_id,
+        </if>
+        <if test="orderFormType != null">
+            order_form_type,
+        </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="memberId != null">
@@ -466,6 +474,12 @@
       <if test="afterSale != null">
         #{afterSale},
       </if>
+        <if test="orchestraId != null">
+            #{orchestraId},
+        </if>
+        <if test="orderFormType != null">
+            #{orderFormType},
+        </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderExample" resultType="java.lang.Long">
@@ -618,6 +632,12 @@
       <if test="record.afterSale != null">
         after_sale = #{record.afterSale},
       </if>
+        <if test="record.orchestraId != null">
+            orchestra_id = #{record.orchestraId},
+        </if>
+        <if test="record.orderFormType != null">
+            order_form_type = #{record.orderFormType},
+        </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -671,6 +691,8 @@
       cart_ids = #{record.cartIds},
       platform_type = #{record.platformType},
       after_sale = #{record.afterSale},
+        orchestra_id = #{record.orchestraId},
+        order_form_type = #{record.orderFormType},
       modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -817,6 +839,12 @@
       <if test="afterSale != null">
         after_sale = #{afterSale},
       </if>
+        <if test="orchestraId != null">
+            orchestra_id = #{orchestraId},
+        </if>
+        <if test="orderFormType != null">
+            order_form_type = #{orderFormType},
+        </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -867,7 +895,17 @@
       cart_ids = #{cartIds},
       platform_type = #{platformType},
       after_sale = #{afterSale},
+        orchestra_id = #{orchestraId},
+        order_form_type = #{orderFormType},
       modify_time = #{modifyTime,jdbcType=TIMESTAMP}
     where id = #{id,jdbcType=BIGINT}
   </update>
+
+
+    <select id="getByOrderSn" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from oms_order
+        where order_sn = #{orderSn}
+    </select>
 </mapper>

Some files were not shown because too many files changed in this diff