Browse Source

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

zouxuan 3 năm trước cách đây
mục cha
commit
693fbe6ae9
21 tập tin đã thay đổi với 562 bổ sung121 xóa
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/GoodsProcurementDao.java
  2. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImLiveBroadcastRoomDto.java
  3. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  4. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoom.java
  5. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrderDetail.java
  6. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java
  7. 43 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  8. 7 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  9. 68 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java
  10. 167 30
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  11. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  12. 117 24
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  13. 45 0
      mec-biz/src/main/resources/config/mybatis/GoodsProcurementMapper.xml
  14. 5 3
      mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml
  15. 1 0
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomReservationMapper.xml
  16. 2 0
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  17. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml
  18. 0 30
      mec-student/src/main/java/com/ym/mec/student/controller/ImLiveBroadcastRoomController.java
  19. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherImLiveBroadcastRoomController.java
  20. 32 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherImLiveRoomVideoController.java
  21. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java

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

@@ -10,6 +10,8 @@ import java.util.Map;
 public interface GoodsProcurementDao extends BaseDAO<Long, GoodsProcurement> {
 
     int batchInsert(@Param("goodsProcurements") List<GoodsProcurement> goodsProcurements);
+    
+    int batchUpdate(@Param("goodsProcurements") List<GoodsProcurement> goodsProcurements);
 
     List<GoodsProcurement> queryGoodsProcurements(Map<String, Object> params);
     int countGoodsProcurements(Map<String, Object> params);

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImLiveBroadcastRoomDto.java

@@ -52,6 +52,9 @@ public class ImLiveBroadcastRoomDto implements Serializable {
     @ApiModelProperty(value = "直播间可见类型-全部可见 ALL / 部分可见 PRIVATE")
     private String popularizeType;
 
+    @ApiModelProperty(value = "播出端-  pc网页端 移动端mobile")
+    private String os = "pc";
+
     @ApiModel(value = "房间配置")
     public static class RoomConfig implements Serializable {
 
@@ -183,5 +186,12 @@ public class ImLiveBroadcastRoomDto implements Serializable {
         this.popularizeType = popularizeType;
     }
 
+    public String getOs() {
+        return os;
+    }
+
+    public void setOs(String os) {
+        this.os = os;
+    }
 }
 

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java

@@ -153,6 +153,9 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     //订单金额
     @ApiModelProperty(value = "订单金额",required = true)
     private BigDecimal orderAmount = BigDecimal.ZERO;
+    
+    //内部库存商品销售转化的收入
+    private BigDecimal translatedIncome = BigDecimal.ZERO;
 
     public enum TypeDesc implements BaseEnum<String, StudentPaymentOrderExportDto.TypeDesc> {
 
@@ -551,4 +554,12 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     public void setPayingStatus(Integer payingStatus) {
         this.payingStatus = payingStatus;
     }
+
+	public BigDecimal getTranslatedIncome() {
+		return translatedIncome;
+	}
+
+	public void setTranslatedIncome(BigDecimal translatedIncome) {
+		this.translatedIncome = translatedIncome;
+	}
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoom.java

@@ -78,6 +78,10 @@ public class ImLiveBroadcastRoom implements Serializable {
     @ApiModelProperty(value = "直播间可见类型-全部可见 ALL / 部分可见 PRIVATE")
     private String popularizeType;
 
+    @TableField("os_")
+    @ApiModelProperty(value = "播出端-  pc网页端 移动端mobile")
+    private String os = "pc";
+
     @TableField("created_by_")
     @ApiModelProperty(value = "创建人")
     private Integer createdBy;
@@ -218,6 +222,14 @@ public class ImLiveBroadcastRoom implements Serializable {
         this.popularize = popularize;
     }
 
+    public String getOs() {
+        return os;
+    }
+
+    public void setOs(String os) {
+        this.os = os;
+    }
+
     public Integer getCreatedBy() {
         return createdBy;
     }

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

@@ -63,7 +63,7 @@ public class StudentPaymentOrderDetail extends BaseEntity {
 	
 	private String incomeItem;
 	
-	private BigDecimal income;
+	private BigDecimal income = BigDecimal.ZERO;
 	
 	private String minuendStockGoodsIdList;
 

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

@@ -27,7 +27,7 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     PageInfo<ImLiveBroadcastRoomVo> queryPage(Map<String, Object> param);
 
-    ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, Integer userId,Integer osType);
+    ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, Integer userId, Integer osType);
 
     ImLiveBroadcastRoomVo queryRoomInfo(String roomUid);
 
@@ -60,7 +60,7 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void opsRoom(List<ImUserState> userState);
 
-    ImLiveBroadcastRoomVo speakerJoinRoom(String roomUid);
+    ImLiveBroadcastRoomVo speakerJoinRoom(String roomUid, String os);
 
     void joinRoom(String roomUid, Integer userId);
 

+ 43 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -26,6 +26,7 @@ import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
 import com.ym.mec.util.ini.IniFileUtil;
 import com.ym.mec.util.upload.UploadUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,6 +39,7 @@ import org.springframework.util.CollectionUtils;
 
 import javax.annotation.PostConstruct;
 import javax.servlet.http.HttpServletResponse;
+
 import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
@@ -69,6 +71,8 @@ public class ExportServiceImpl implements ExportService {
     @Autowired
     private MusicGroupDao musicGroupDao;
     @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
     private StoragePluginContext storagePluginContext;
     @Autowired
     private ManagerDownloadDao managerDownloadDao;
@@ -2442,34 +2446,33 @@ public class ExportServiceImpl implements ExportService {
                             row.setMusicGroupCourseFee(row.getMusicGroupCourseFee().add(orderDetail.getPrice()));
                             break;
                         case MUSICAL:
+                        	BigDecimal income = orderDetail.getIncome();
+                        	//扣除内部库存的商品销售收入统计在云教练中
                         	if(StringUtils.equals(orderDetail.getIncomeItem(), OrderDetailTypeEnum.CLOUD_TEACHER.name())){
-                        		row.setCloudTeacherFee(orderDetail.getIncome());
-                        		break;
+                        		row.setTranslatedIncome(row.getTranslatedIncome().add(income.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN)));
                         	}
                             if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
-                                BigDecimal leaseFee = orderDetail.getPrice();
+                                BigDecimal leaseFee = orderDetail.getPrice().subtract(income);
                                 if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
-                                    leaseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                                    leaseFee = orderDetail.getPrice().subtract(income).multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
                                 }
                                 row.setLeaseFee(leaseFee);
                             } else {
-                                row.setMusicalFee(orderDetail.getPrice());
+                                row.setMusicalFee(orderDetail.getPrice().subtract(orderDetail.getIncome()));
                             }
                             break;
                         case ACCESSORIES:
                         case TEACHING:
                         	if(StringUtils.equals(orderDetail.getIncomeItem(), OrderDetailTypeEnum.CLOUD_TEACHER.name())){
-                        		row.setCloudTeacherFee(orderDetail.getIncome());
-                        		break;
+                        		row.setTranslatedIncome(row.getTranslatedIncome().add(orderDetail.getIncome().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN)));
                         	}
-                            row.setTeachingFee(row.getTeachingFee().add(orderDetail.getPrice()));
+                            row.setTeachingFee(row.getTeachingFee().add(orderDetail.getPrice().subtract(orderDetail.getIncome())));
                             break;
                         case OTHER:
                         	if(StringUtils.equals(orderDetail.getIncomeItem(), OrderDetailTypeEnum.CLOUD_TEACHER.name())){
-                        		row.setCloudTeacherFee(orderDetail.getIncome());
-                        		break;
+                        		row.setTranslatedIncome(row.getTranslatedIncome().add(orderDetail.getIncome().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN)));
                         	}
-                            row.setOtherFee(row.getOtherFee().add(orderDetail.getPrice()));
+                            row.setOtherFee(row.getOtherFee().add(orderDetail.getPrice().subtract(orderDetail.getIncome())));
                             break;
                         case MAINTENANCE:
                             BigDecimal maintenanceFee = BigDecimal.ZERO;
@@ -2484,7 +2487,7 @@ public class ExportServiceImpl implements ExportService {
                             if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
                                 cloudTeacherFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
                             }
-                            row.setCloudTeacherFee(cloudTeacherFee);
+                    		row.setCloudTeacherFee(row.getCloudTeacherFee().add(cloudTeacherFee));
                             break;
                         case DEGREE_REGISTRATION:
                             BigDecimal degreeFee = BigDecimal.ZERO;
@@ -2625,11 +2628,14 @@ public class ExportServiceImpl implements ExportService {
                 }
             } else {
                 StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
-                BigDecimal childRepairFee = sellOrderDao.getChildRepair(row.getId());
-                row.setMusicalFee(feeByType.getMusicalFee());
-                row.setTeachingFee(feeByType.getTeachingFee().subtract(childRepairFee));
-                row.setMaintenanceProductFee(feeByType.getRepairFee().add(childRepairFee));
-                row.setOtherFee(feeByType.getOtherFee());
+                //兼容历史数据
+                if(row.getCreateTime().before(DateUtil.stringToDate("2022-06-15 00:00:00"))){
+	                BigDecimal childRepairFee = sellOrderDao.getChildRepair(row.getId());
+	                row.setMusicalFee(feeByType.getMusicalFee());
+	                row.setTeachingFee(feeByType.getTeachingFee().subtract(childRepairFee));
+	                row.setMaintenanceProductFee(feeByType.getRepairFee().add(childRepairFee));
+	                row.setOtherFee(feeByType.getOtherFee());
+                }
                 if (row.getGroupType().equals(GroupType.MUSIC)) {
                     StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
                     if (studentRegistration != null) {
@@ -2638,7 +2644,7 @@ public class ExportServiceImpl implements ExportService {
                         row.setCooperationOrganName(studentRegistration.getRemark());
                         row.setEduTeacher(studentRegistration.getName());
                     }
-                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(row.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()).subtract(row.getCloudTeacherFee()));
+                    //row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(row.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()).subtract(row.getCloudTeacherFee()));
                 } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
                     row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
                 } else if (row.getType().equals(OUTORDER)) {
@@ -2686,6 +2692,9 @@ public class ExportServiceImpl implements ExportService {
             row.setPaymentChannel(paymentChannel);
             row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
         }
+        
+		//查询商品收款账户配置
+        String goodsSellReceiptMerNo = sysConfigDao.findConfigValue("goodsSellReceiptMerNo");
 
         Map<Long, List<StudentPaymentOrderExportDto>> orderMap = studentPaymentOrderExportDtos.stream().collect(Collectors.groupingBy(StudentPaymentOrderExportDto::getId));
         orderMap.forEach((orderId, orders) -> {
@@ -2709,6 +2718,22 @@ public class ExportServiceImpl implements ExportService {
                 if (order.getPayTime() == null || order.getPayTime().compareTo(endDate) < 0) {
                     break;
                 }
+                //如果有转化的销售服务
+                if(StringUtils.equals(order.getRouteMerNo(), goodsSellReceiptMerNo) && order.getTranslatedIncome().compareTo(order.getRouteAmount()) == 0){
+                	order.setMusicGroupCourseFee(BigDecimal.ZERO);
+                    order.setVipCourseFee(BigDecimal.ZERO);
+                    order.setPracticeCourseFee(BigDecimal.ZERO);
+                    order.setTheoryCourseFee(BigDecimal.ZERO);
+                    order.setDegreeFee(BigDecimal.ZERO);
+                    order.setMaintenanceFee(BigDecimal.ZERO);
+                    order.setCloudTeacherFee(order.getTranslatedIncome());
+                    order.setRepairFee(BigDecimal.ZERO);
+                    order.setMusicalFee(BigDecimal.ZERO);
+                    order.setTeachingFee(BigDecimal.ZERO);
+                    order.setOtherFee(BigDecimal.ZERO);
+                    order.setLeaseFee(BigDecimal.ZERO);
+                	continue;
+                }
                 if (order.getSaleAmount().compareTo(BigDecimal.ZERO) > 0 && order.getServiceAmount().compareTo(BigDecimal.ZERO) == 0) {
                     order.setMusicGroupCourseFee(BigDecimal.ZERO);
                     order.setVipCourseFee(BigDecimal.ZERO);

+ 7 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -139,7 +139,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, SysUser sysUser, Integer osType) {
         Optional<ImLiveBroadcastRoomVo> optional;
         //如果是学生端,则需要检查是否有权限进入
-        if (osType == 1) {
+        if (Objects.equals(osType, 1)) {
             Map<String, Object> param = new HashMap<>();
             param.put("roomUid", roomUid);
             optional = Optional.of(param).map(this::getImLiveBroadcastRoomVo);
@@ -794,9 +794,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      *
      * @param roomUid
      */
-    public ImLiveBroadcastRoomVo speakerJoinRoom(String roomUid) {
+    public ImLiveBroadcastRoomVo speakerJoinRoom(String roomUid, String os) {
         SysUser sysUser = getSysUser();
-        ImLiveBroadcastRoomVo roomVo = queryRoomAndCheck(roomUid, sysUser, 0);
+        ImLiveBroadcastRoomVo roomVo = queryRoomAndCheck(roomUid, sysUser, null);
+        if (!os.equals(roomVo.getOs())) {
+            String ex = roomVo.getOs().equals("pc") ? "电脑": "手机";
+            throw new BizException("该直播间仅可在"+ex+"端直播");
+        }
         Integer userId = sysUser.getId();
         if (!userId.equals(roomVo.getSpeakerId())) {
             throw new BizException("您不是该直播间的主讲人");

+ 68 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java

@@ -19,12 +19,14 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.dao.GoodsProcurementDao;
 import com.ym.mec.biz.dal.dao.HfMemberDao;
 import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.AmountChannelDto;
 import com.ym.mec.biz.dal.dto.RouteScaleDto;
 import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.GoodsProcurement;
 import com.ym.mec.biz.dal.entity.HfMember;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
@@ -74,6 +76,8 @@ public class PayServiceImpl implements PayService {
     private HfMemberDao hfMemberDao;
     @Autowired
     private RedisCache<String, Object> redisCache;
+    @Autowired
+    private GoodsProcurementDao goodsProcurementDao;
 
     @Override
     public Map<String, Object> getPayMap(BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer organId, String receiver) throws Exception {
@@ -175,6 +179,8 @@ public class PayServiceImpl implements PayService {
 		BigDecimal subBalance = BigDecimal.ZERO;
 		
 		BigDecimal subCashAmount = BigDecimal.ZERO;
+		
+		RouteScaleDto routeScaleDtoForGoodsSell = null;
     	//忽略的分部
 		List<Integer> ignoreOrganList = Arrays.asList(4, 55, 59);
 		
@@ -189,19 +195,22 @@ public class PayServiceImpl implements PayService {
         	if(sysPaymentConfig != null){
 
     			List<StudentPaymentOrderDetail> batchUpdateList = new ArrayList<StudentPaymentOrderDetail>();
-    			List<Goods> batchUpdateGoodsList = new ArrayList<Goods>();
+    			Map<Integer, Goods> batchUpdateGoodsMap = new HashMap<Integer, Goods>();
         		
         		// 如果买了商品或组合商品,商品有内部库存,则将钱转入指定账户已云教练的方式作为收费项目(杭州、齐齐哈尔除外)
         		// 1.查询商品订单明细
         		List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = studentPaymentOrderDetailService.queryOrderDetail(studentPaymentOrder.getId());
         		if (studentPaymentOrderDetailList != null && studentPaymentOrderDetailList.size() > 0) {
         			
+        			Map<Long, GoodsProcurement> goodsProcurementMap = new HashMap<Long, GoodsProcurement>();
+        			
         			String goodIds = studentPaymentOrderDetailList.stream().filter(t -> StringUtils.isNotBlank(t.getGoodsIdList())).map(StudentPaymentOrderDetail :: getGoodsIdList).collect(Collectors.joining(","));
         			if(StringUtils.isNotBlank(goodIds)){
         				List<Goods> goodsList = goodsService.getGoodsWithLocked(goodIds);
         				
         				Map<Integer,Goods> goodsMap = goodsList.stream().collect(Collectors.toMap(Goods :: getId, t -> t));
         				Goods goods = null;
+        				GoodsProcurement goodsProcurement = null;
         				BigDecimal totalAmout = studentPaymentOrder.getExpectAmount();
         				List<Integer> minuendStockGoodsIdList = null;
         				
@@ -235,24 +244,57 @@ public class PayServiceImpl implements PayService {
         								for(Goods subGoods : goodsList){
         									//判断是否有内部库存
         									if(subGoods.getStockCount() > 0){
+        										
+        										if(batchUpdateGoodsMap.get(subGoods.getId()) != null){
+        											subGoods = batchUpdateGoodsMap.get(subGoods.getId());
+        										}
+        										
         										groupPurchaseAmount = groupPurchaseAmount.add(subGoods.getGroupPurchasePrice());
         										subGoods.setStockCount(new AtomicInteger(subGoods.getStockCount()).decrementAndGet());
+            									subGoods.setSellCount(new AtomicInteger(subGoods.getSellCount()).incrementAndGet());
         										subGoods.setUpdateTime(date);
-        										batchUpdateGoodsList.add(subGoods);
+        										
+        										batchUpdateGoodsMap.put(subGoods.getId(), subGoods);
         										
         										minuendStockGoodsIdList.add(subGoods.getId());
+        										
+        										goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(goods.getId());
+        										if(goodsProcurement != null){
+        											if(goodsProcurementMap.get(goodsProcurement.getId()) != null){
+        												goodsProcurement = goodsProcurementMap.get(goodsProcurement.getId());
+        											}
+        											goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).incrementAndGet());
+        											goodsProcurement.setUpdateTime(date);
+        											goodsProcurementMap.put(goodsProcurement.getId(), goodsProcurement);
+        										}
         									}
         								}
         							}else{
     									totalGroupPurchaseAmount = totalGroupPurchaseAmount.add(goods.getGroupPurchasePrice());
         								//判断是否有内部库存
         								if(goods.getStockCount() > 0){
+        									
+        									if(batchUpdateGoodsMap.get(goods.getId()) != null){
+        										goods = batchUpdateGoodsMap.get(goods.getId());
+    										}
+        									
     										groupPurchaseAmount = groupPurchaseAmount.add(goods.getGroupPurchasePrice());
     										goods.setStockCount(new AtomicInteger(goods.getStockCount()).decrementAndGet());
+    										goods.setSellCount(new AtomicInteger(goods.getSellCount()).incrementAndGet());
     										goods.setUpdateTime(date);
-    										batchUpdateGoodsList.add(goods);
+    										batchUpdateGoodsMap.put(goods.getId(), goods);
     										
     										minuendStockGoodsIdList.add(goods.getId());
+    										
+    										goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(goods.getId());
+    										if(goodsProcurement != null){
+    											if(goodsProcurementMap.get(goodsProcurement.getId()) != null){
+    												goodsProcurement = goodsProcurementMap.get(goodsProcurement.getId());
+    											}
+    											goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).incrementAndGet());
+    											goodsProcurement.setUpdateTime(date);
+    											goodsProcurementMap.put(goodsProcurement.getId(), goodsProcurement);
+    										}
         								}
         							}
         						}
@@ -278,14 +320,18 @@ public class PayServiceImpl implements PayService {
 							}
         				}
         			}
+        			
+        			if(goodsProcurementMap.size() > 0){
+        				goodsProcurementDao.batchUpdate(new ArrayList<GoodsProcurement>(goodsProcurementMap.values()));
+        			}
         		}
         		
         		if(batchUpdateList.size() > 0){
         			studentPaymentOrderDetailService.batchUpdate(batchUpdateList);
         		}
         		
-        		if(batchUpdateGoodsList.size() > 0){
-        			goodsService.batchUpdate(batchUpdateGoodsList);
+        		if(batchUpdateGoodsMap.size() > 0){
+        			goodsService.batchUpdate(new ArrayList<Goods>(batchUpdateGoodsMap.values()));
         		}
         		
         		if(subCashAmount.doubleValue() > 0){
@@ -301,6 +347,15 @@ public class PayServiceImpl implements PayService {
     	            studentPaymentRouteOrder.setCreateTime(date);
     	            studentPaymentRouteOrder.setUpdateTime(date);
     	            studentPaymentRouteOrderDao.insert(studentPaymentRouteOrder);
+    	            
+
+    	            routeScaleDtoForGoodsSell = new RouteScaleDto();
+    	            routeScaleDtoForGoodsSell.setAmount(subCashAmount);
+    	            routeScaleDtoForGoodsSell.setOrganId(sysPaymentConfig.getOrganId());
+    	            routeScaleDtoForGoodsSell.setPayType(PaymentChannelEnum.ADAPAY);
+    	            routeScaleDtoForGoodsSell.setScale(100);
+    	            routeScaleDtoForGoodsSell.setMerNo(goodsSellReceiptMerNo);
+    	            routeScaleDtoForGoodsSell.setFeeFlag("Y");
         		}
         	}
         }
@@ -337,6 +392,10 @@ public class PayServiceImpl implements PayService {
         for (RouteScaleDto routeScaleDto : routeScaleDtos) {
             checkMaxReceipt(routeScaleDto, routeScaleDto.getMerNo());
         }
+        
+        if(routeScaleDtoForGoodsSell != null){
+        	routeScaleDtos.add(routeScaleDtoForGoodsSell);
+        }
 
         return getPayRoute(amount, balanceAmount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, routeScaleDtos, subCashAmount);
     }
@@ -688,8 +747,10 @@ public class PayServiceImpl implements PayService {
             routingMerNoSet.add(routeScaleDto.getMerNo());
         }
 
-        if (studentPaymentRouteOrderDao.batchAdd(RouteOrders) <= 0) {
-            throw new BizException("调用支付接口失败");
+        if(RouteOrders.size() > 0) {
+	        if (studentPaymentRouteOrderDao.batchAdd(RouteOrders) <= 0) {
+	            throw new BizException("调用支付接口失败");
+	        }
         }
 
         if (payType.equals(PaymentChannelEnum.YQPAY)) {

+ 167 - 30
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -1,16 +1,157 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
+import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
+import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.MAINTENANCE;
+import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.PRACTICE;
+import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.VIP;
+import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
+import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
 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.auth.api.enums.CertificateTypeEnum;
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.GoodsDao;
+import com.ym.mec.biz.dal.dao.GoodsProcurementDao;
+import com.ym.mec.biz.dal.dao.ImGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderStudentDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.StudentCourseFeeDetailDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentInstrumentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.dao.SubjectDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.MusicGroupApplyGoodsDto;
+import com.ym.mec.biz.dal.dto.NoClassMusicStudentDto;
+import com.ym.mec.biz.dal.dto.PageInfoReg;
+import com.ym.mec.biz.dal.dto.RegisterDto;
+import com.ym.mec.biz.dal.dto.RegisterPayDto;
+import com.ym.mec.biz.dal.dto.StudentAddDto;
+import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
+import com.ym.mec.biz.dal.dto.StudentCourseInfoDto;
+import com.ym.mec.biz.dal.dto.StudentInfo;
+import com.ym.mec.biz.dal.dto.StudentMusicDetailDto;
+import com.ym.mec.biz.dal.dto.StudentMusicGroupDto;
+import com.ym.mec.biz.dal.dto.StudentRegisterInstrumentsDetailDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.CouponPayParam;
+import com.ym.mec.biz.dal.entity.CouponPayTypeInfo;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.GoodsProcurement;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderActivity;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderMember;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderRepair;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentCourseFeeDetail;
+import com.ym.mec.biz.dal.entity.StudentInstrument;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.entity.SubjectChange;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
+import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.CouponDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.SysUserRoleEnum;
+import com.ym.mec.biz.dal.page.MusicGroupRecordStudentQueryInfo;
+import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
+import com.ym.mec.biz.dal.page.RegistrationOrPreQueryInfo;
+import com.ym.mec.biz.dal.page.StudentPreRegistrationQueryInfo;
+import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
 import com.ym.mec.biz.event.source.SendSeoMessageSource;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.ClassGroupStudentMapperService;
+import com.ym.mec.biz.service.CloudTeacherOrderService;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderActivityService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderMemberService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderRepairService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
+import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.biz.service.SubjectService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysTenantConfigService;
+import com.ym.mec.biz.service.SysUserCashAccountDetailService;
+import com.ym.mec.biz.service.SysUserCashAccountLogService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImResult;
@@ -25,30 +166,6 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
-import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
-import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.*;
-import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
-import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
-
 @Service
 public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, StudentRegistration> implements StudentRegistrationService {
 
@@ -134,6 +251,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     private ImGroupDao imGroupDao;
     @Autowired
     private StudentInstrumentDao studentInstrumentDao;
+    
+    @Autowired
+    private GoodsProcurementDao goodsProcurementDao;
+    
     @Autowired
     private MusicGroupPaymentCalenderStudentDetailDao musicGroupPaymentCalenderStudentDetailDao;
     @Autowired
@@ -1248,6 +1369,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             } catch (Exception e) {
                 LOGGER.error("协议生成失败", e);
             }
+            
         }
 
         if (studentPaymentOrder.getStatus().equals(DealStatusEnum.FAILED)) {
@@ -1262,11 +1384,26 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = studentPaymentOrderDetailService.queryOrderDetail(studentPaymentOrder.getId());
             String goodsIds = studentPaymentOrderDetailList.stream().filter(t -> StringUtils.isNotBlank(t.getMinuendStockGoodsIdList())).map(t -> t.getMinuendStockGoodsIdList()).collect(Collectors.joining(","));
             if(StringUtils.isNotBlank(goodsIds)){
+            	GoodsProcurement goodsProcurement = null;
+            	List<GoodsProcurement> goodsProcurementList = new ArrayList<GoodsProcurement>();
             	List<Goods> goodsList = goodsService.getGoodsWithLocked(goodsIds);
             	for(Goods subGoods : goodsList){
 					subGoods.setStockCount(new AtomicInteger(subGoods.getStockCount()).incrementAndGet());
+					subGoods.setSellCount(new AtomicInteger(subGoods.getSellCount()).decrementAndGet());
 					subGoods.setUpdateTime(nowDate);
 					batchUpdateGoodsList.add(subGoods);
+					
+					// 进货清单
+					goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(subGoods.getId());
+					if(goodsProcurement != null){
+						goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).decrementAndGet());
+						goodsProcurement.setUpdateTime(nowDate);
+						goodsProcurementList.add(goodsProcurement);
+					}
+            	}
+            	
+            	if(goodsProcurementList.size() > 0){
+            		goodsProcurementDao.batchUpdate(goodsProcurementList);
             	}
             }
             

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java

@@ -34,6 +34,7 @@ import com.alibaba.fastjson.JSONArray;
 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.GoodsProcurementDao;
 import com.ym.mec.biz.dal.dao.MusicGroupDao;
 import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dao.StudentGoodsSellDao;
@@ -43,6 +44,7 @@ import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.GoodsSellDto;
 import com.ym.mec.biz.dal.dto.RepairGoodsDto;
 import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.GoodsProcurement;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.SellOrder;
 import com.ym.mec.biz.dal.entity.StudentGoodsSell;
@@ -126,6 +128,8 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
     @Autowired
     private StudentGoodsSellDao studentGoodsSellDao;
     @Autowired
+    private GoodsProcurementDao goodsProcurementDao;
+    @Autowired
     private ContractService contractService;
     @Autowired
     private GoodsService goodsService;
@@ -958,11 +962,26 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = studentPaymentOrderDetailService.queryOrderDetail(studentPaymentOrder.getId());
             String goodsIds = studentPaymentOrderDetailList.stream().filter(t -> StringUtils.isNotBlank(t.getMinuendStockGoodsIdList())).map(t -> t.getMinuendStockGoodsIdList()).collect(Collectors.joining(","));
             if(StringUtils.isNotBlank(goodsIds)){
+            	GoodsProcurement goodsProcurement = null;
+            	List<GoodsProcurement> goodsProcurementList = new ArrayList<GoodsProcurement>();
             	List<Goods> goodsList = goodsService.getGoodsWithLocked(goodsIds);
             	for(Goods subGoods : goodsList){
 					subGoods.setStockCount(new AtomicInteger(subGoods.getStockCount()).incrementAndGet());
+					subGoods.setSellCount(new AtomicInteger(subGoods.getSellCount()).decrementAndGet());
 					subGoods.setUpdateTime(nowDate);
 					batchUpdateGoodsList.add(subGoods);
+					
+					// 进货清单
+					goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(subGoods.getId());
+					if(goodsProcurement != null){
+						goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).decrementAndGet());
+						goodsProcurement.setUpdateTime(nowDate);
+						goodsProcurementList.add(goodsProcurement);
+					}
+            	}
+            	
+            	if(goodsProcurementList.size() > 0){
+            		goodsProcurementDao.batchUpdate(goodsProcurementList);
             	}
             }
             
@@ -1355,11 +1374,26 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = studentPaymentOrderDetailService.queryOrderDetail(studentPaymentOrder.getId());
             String goodsIds = studentPaymentOrderDetailList.stream().filter(t -> StringUtils.isNotBlank(t.getMinuendStockGoodsIdList())).map(t -> t.getMinuendStockGoodsIdList()).collect(Collectors.joining(","));
             if(StringUtils.isNotBlank(goodsIds)){
+            	GoodsProcurement goodsProcurement = null;
+            	List<GoodsProcurement> goodsProcurementList = new ArrayList<GoodsProcurement>();
             	List<Goods> goodsList = goodsService.getGoodsWithLocked(goodsIds);
             	for(Goods subGoods : goodsList){
 					subGoods.setStockCount(new AtomicInteger(subGoods.getStockCount()).incrementAndGet());
+					subGoods.setSellCount(new AtomicInteger(subGoods.getSellCount()).decrementAndGet());
 					subGoods.setUpdateTime(nowDate);
 					batchUpdateGoodsList.add(subGoods);
+					
+					// 进货清单
+					goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(subGoods.getId());
+					if(goodsProcurement != null){
+						goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).decrementAndGet());
+						goodsProcurement.setUpdateTime(nowDate);
+						goodsProcurementList.add(goodsProcurement);
+					}
+            	}
+            	
+            	if(goodsProcurementList.size() > 0){
+            		goodsProcurementDao.batchUpdate(goodsProcurementList);
             	}
             }
             

+ 117 - 24
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java

@@ -1,39 +1,99 @@
 package com.ym.mec.biz.service.impl;
 
-import com.ym.mec.biz.dal.dao.*;
+import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
+import static com.ym.mec.biz.dal.enums.GroupType.SUBJECT_CHANGE;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.ListUtils;
+import org.apache.commons.lang3.StringUtils;
+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.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.ym.mec.biz.dal.dao.GoodsDao;
+import com.ym.mec.biz.dal.dao.GoodsProcurementDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPurchaseListDao;
+import com.ym.mec.biz.dal.dao.SellOrderDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountLogDao;
 import com.ym.mec.biz.dal.dto.SubjectChangeParamDto;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.GoodsProcurement;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupPurchaseList;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
+import com.ym.mec.biz.dal.entity.SellOrder;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.SubjectChange;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
+import com.ym.mec.biz.dal.entity.SysUserCashAccountLog;
+import com.ym.mec.biz.dal.enums.AccountType;
+import com.ym.mec.biz.dal.enums.CouponDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PayStatus;
+import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
+import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.ReturnFeeEnum;
+import com.ym.mec.biz.dal.enums.SellTypeEnum;
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.SubjectChangeStatusEnum;
 import com.ym.mec.biz.dal.page.SubjectChangeQueryInfo;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.PayService;
+import com.ym.mec.biz.service.SellOrderService;
+import com.ym.mec.biz.service.StudentInstrumentService;
+import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.SubjectChangeService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysPaymentConfigService;
+import com.ym.mec.biz.service.SysUserCashAccountDetailService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-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.Isolation;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
-import static com.ym.mec.biz.dal.enums.GroupType.SUBJECT_CHANGE;
-
 @Service
 public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectChange> implements SubjectChangeService {
 
@@ -91,6 +151,8 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
     private SysCouponCodeService sysCouponCodeService;
     @Autowired
     private SysUserCashAccountLogDao sysUserCashAccountLogDao;
+    @Autowired
+    private GoodsProcurementDao goodsProcurementDao;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -247,7 +309,8 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         	if(StringUtils.isNotBlank(subjectChange.getOriginalAccessories())){
         		originalAccessories = Arrays.asList(subjectChange.getOriginalAccessories().split(","));
         	}
-        	changeAccessoriesList.removeAll(originalAccessories);
+        	//changeAccessoriesList.removeAll(originalAccessories);
+        	changeAccessoriesList = ListUtils.subtract(changeAccessoriesList, originalAccessories);
         	
         	if(subjectChange.getChangeMusical() != subjectChange.getOriginalMusical()){
         		changeAccessoriesList.add(subjectChange.getChangeMusical()+"");
@@ -789,11 +852,26 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
 	        goodsIdsStr = originalAccessories.stream().map(t -> t.toString()).collect(Collectors.joining(","));
             //增加商品库存
             if(StringUtils.isNotBlank(goodsIdsStr)){
+            	GoodsProcurement goodsProcurement = null;
+            	List<GoodsProcurement> goodsProcurementList = new ArrayList<GoodsProcurement>();
             	List<Goods> goodsList = goodsService.getGoodsWithLocked(goodsIdsStr);
             	for(Goods subGoods : goodsList){
 					subGoods.setStockCount(new AtomicInteger(subGoods.getStockCount()).incrementAndGet());
+					subGoods.setSellCount(new AtomicInteger(subGoods.getSellCount()).decrementAndGet());
 					subGoods.setUpdateTime(nowDate);
 					batchUpdateGoodsList.add(subGoods);
+					
+					// 进货清单
+					goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(subGoods.getId());
+					if(goodsProcurement != null){
+						goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).decrementAndGet());
+						goodsProcurement.setUpdateTime(nowDate);
+						goodsProcurementList.add(goodsProcurement);
+					}
+            	}
+            	
+            	if(goodsProcurementList.size() > 0){
+            		goodsProcurementDao.batchUpdate(goodsProcurementList);
             	}
             }
             
@@ -813,11 +891,26 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
             List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = studentPaymentOrderDetailService.queryOrderDetail(studentPaymentOrder.getId());
             String goodsIds = studentPaymentOrderDetailList.stream().filter(t -> StringUtils.isNotBlank(t.getMinuendStockGoodsIdList())).map(t -> t.getMinuendStockGoodsIdList()).collect(Collectors.joining(","));
             if(StringUtils.isNotBlank(goodsIds)){
+            	GoodsProcurement goodsProcurement = null;
+            	List<GoodsProcurement> goodsProcurementList = new ArrayList<GoodsProcurement>();
             	List<Goods> goodsList = goodsService.getGoodsWithLocked(goodsIds);
             	for(Goods subGoods : goodsList){
 					subGoods.setStockCount(new AtomicInteger(subGoods.getStockCount()).incrementAndGet());
+					subGoods.setSellCount(new AtomicInteger(subGoods.getSellCount()).decrementAndGet());
 					subGoods.setUpdateTime(nowDate);
 					batchUpdateGoodsList.add(subGoods);
+					
+					// 进货清单
+					goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(subGoods.getId());
+					if(goodsProcurement != null){
+						goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).decrementAndGet());
+						goodsProcurement.setUpdateTime(nowDate);
+						goodsProcurementList.add(goodsProcurement);
+					}
+            	}
+            	
+            	if(goodsProcurementList.size() > 0){
+            		goodsProcurementDao.batchUpdate(goodsProcurementList);
             	}
             }
             

+ 45 - 0
mec-biz/src/main/resources/config/mybatis/GoodsProcurementMapper.xml

@@ -92,6 +92,51 @@
 		</set> WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>
 	
+    <update id="batchUpdate" parameterType="java.util.List">
+        <foreach collection="goodsProcurements" item="item" index="index" open="" close="" separator=";">
+			UPDATE goods_procurement
+			<set>
+				<if test="item.operatorId != null">
+					operator_id_ = #{item.operatorId},
+				</if>
+				<if test="item.agreeCostPrice != null">
+					agree_cost_price_ = #{item.agreeCostPrice},
+				</if>
+				<if test="item.id != null">
+					id_ = #{item.id},
+				</if>
+				<if test="item.goodsCategoryId != null">
+					goods_category_id_ = #{item.goodsCategoryId},
+				</if>
+				<if test="item.taxStockCount != null">
+					tax_stock_count_ = #{item.taxStockCount},
+				</if>
+				<if test="item.supplyChannel != null">
+					supply_channel_ = #{item.supplyChannel},
+				</if>
+				<if test="item.discountPrice != null">
+					discount_price_ = #{item.discountPrice},
+				</if>
+				<if test="item.stockCount != null">
+					stock_count_ = #{item.stockCount},
+				</if>
+				<if test="item.goodsId != null">
+					goods_id_ = #{item.goodsId},
+				</if>
+				<if test="item.batchNo != null">
+					batch_no_ = #{item.batchNo},
+				</if>
+				<if test="item.stockSoldNum != null">
+					stock_sold_num_ = #{item.stockSoldNum},
+				</if>
+				<if test="item.taxStockSoldNum != null">
+					tax_stock_sold_num_ = #{item.taxStockSoldNum},
+				</if>
+					update_time_ = NOW(),
+			</set> WHERE id_ = #{item.id} and tenant_id_ = #{item.tenantId}
+		</foreach>
+	</update>
+	
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM goods_procurement WHERE id_ = #{id} 

+ 5 - 3
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml

@@ -16,6 +16,7 @@
         <result column="room_state_" jdbcType="INTEGER" property="roomState"/>
         <result column="popularize_" jdbcType="INTEGER" property="popularize"/>
         <result column="popularize_type_" jdbcType="VARCHAR" property="popularizeType"/>
+        <result column="os_" jdbcType="VARCHAR" property="os"/>
         <result column="created_by_" jdbcType="INTEGER" property="createdBy"/>
         <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
         <result column="updated_by_" jdbcType="INTEGER" property="updatedBy"/>
@@ -26,13 +27,13 @@
             parameterType="com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom">
         insert into im_live_broadcast_room(tenant_id_, speaker_id_, room_uid_, room_title_, live_start_time_,
         live_end_time_, live_remark_, pre_template_, room_config_, live_state_, room_state_,
-        popularize_, popularize_type_, created_by_, created_time_, updated_by_, updated_time_)
+        popularize_, popularize_type_, os_, created_by_, created_time_, updated_by_, updated_time_)
         values
         <foreach collection="entities" item="entity" separator=",">
             (#{entity.tenantId}, #{entity.speakerId}, #{entity.roomUid}, #{entity.roomTitle}, #{entity.liveStartTime},
             #{entity.liveEndTime}, #{entity.liveRemark}, #{entity.preTemplate}, #{entity.roomConfig},
-            #{entity.liveState}, #{entity.roomState}, #{entity.popularize},
-            #{entity.popularizeType}, #{entity.createdBy}, #{entity.createdTime}, #{entity.updatedBy},#{entity.updatedTime})
+            #{entity.liveState}, #{entity.roomState}, #{entity.popularize}, #{entity.popularizeType},#{entity.os},
+            #{entity.createdBy}, #{entity.createdTime}, #{entity.updatedBy},#{entity.updatedTime})
         </foreach>
     </insert>
 
@@ -41,6 +42,7 @@
         a.tenant_id_ AS tenantId,
         t.name_ AS tenantName,
         t.logo_ AS tenantLogo,
+        a.os_ AS os,
         a.room_uid_ AS roomUid,
         a.room_title_ AS roomTitle,
         a.live_remark_ AS liveRemark,

+ 1 - 0
mec-biz/src/main/resources/config/mybatis/ImLiveRoomReservationMapper.xml

@@ -28,6 +28,7 @@
         a.tenant_id_ AS tenantId,
         t.name_ AS tenantName,
         t.logo_ AS tenantLogo,
+        a.os_ AS os,
         a.room_uid_ AS roomUid,
         a.room_title_ AS roomTitle,
         a.live_remark_ AS liveRemark,

+ 2 - 0
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -595,6 +595,8 @@
             <result column="detail_type_" property="type"/>
             <result column="detail_price_" property="price"/>
             <result column="detail_kit_group_purchase_type_" property="kitGroupPurchaseType"/>
+            <result column="income_item_" property="incomeItem"/>
+            <result column="income_" property="income"/>
         </collection>
         <collection property="goodsList" ofType="com.ym.mec.biz.dal.entity.Goods">
             <result column="goods_id" property="id"/>

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml

@@ -289,7 +289,7 @@ calender_id_,create_time_,create_by_,update_time_,update_by_,tenant_id_,type_
     <select id="ExportQueryPage" resultMap="com.ym.mec.biz.dal.dao.StudentPaymentOrderDao.orderAndDetail"
             parameterType="map">
         SELECT spo.*,u.username_,spod.id_ detail_id_,spod.type_ detail_type_,spod.price_
-        detail_price_,spod.kit_group_purchase_type_ detail_kit_group_purchase_type_,
+        detail_price_,spod.kit_group_purchase_type_ detail_kit_group_purchase_type_,spod.income_item_,spod.income_,
         sci.charge_type_,g.id_ goods_id, g.name_ goods_name,o.name_ organ_name,spro.route_amount_
         routeAmount,spro.route_balance_amount_ routeBalance,spro.sale_amount_,spro.service_amount_,spro.service_fee_,
         spro.mer_no_ routeMerNo,spro.fee_flag_ feeFlag

+ 0 - 30
mec-student/src/main/java/com/ym/mec/student/controller/ImLiveBroadcastRoomController.java

@@ -48,26 +48,12 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed(imLiveBroadcastRoomService.queryRoomAndCheck(roomUid, userId, 1));
     }
 
-    @ApiOperation("同步点赞数量")
-    @GetMapping("/syncLike")
-    public HttpResponseResult<Object> syncLike(@ApiParam(value = "房间uid", required = true) String roomUid,
-                                               @ApiParam(value = "点赞数", required = true) Integer likeNum) {
-        imLiveBroadcastRoomService.syncLike(roomUid, likeNum);
-        return succeed();
-    }
-
     @PostMapping("/quitRoom")
     public HttpResponseResult<Object> quitRoom(@RequestBody List<ImUserState> userState) {
         imLiveBroadcastRoomService.opsRoom(userState);
         return succeed();
     }
 
-    @ApiOperation("主讲人进入房间")
-    @GetMapping("/speakerJoinRoom")
-    public HttpResponseResult<ImLiveBroadcastRoomVo> speakerJoinRoom(String roomUid) {
-        return succeed(imLiveBroadcastRoomService.speakerJoinRoom(roomUid));
-    }
-
     @ApiOperation("学生-进入房间")
     @GetMapping("/joinRoom")
     public HttpResponseResult<Object> joinRoom(String roomUid, Integer userId) {
@@ -75,21 +61,5 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed();
     }
 
-    @ApiOperation("开启/关闭直播的录像")
-    @GetMapping("/opsLiveVideo")
-    public HttpResponseResult<Object> opsLiveVideo(@ApiParam(value = "房间uid", required = true) String roomUid,
-                                                   @ApiParam(value = "用户id", required = true) Integer userId,
-                                                   @ApiParam(value = "type 1:开始直播-开始录像     2:关闭直播关闭录像", required = true) Integer type) {
-        if (type == 1) {
-            imLiveBroadcastRoomService.startLive(roomUid, userId);
-        } else if (type == 2) {
-            imLiveBroadcastRoomService.closeLive(roomUid, userId);
-        } else {
-            failed("type参数错误");
-        }
-        return succeed();
-    }
-
-
 }
 

+ 1 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherImLiveBroadcastRoomController.java

@@ -96,7 +96,7 @@ public class TeacherImLiveBroadcastRoomController extends BaseController {
     @ApiOperation("主讲人进入房间")
     @GetMapping("/speakerJoinRoom")
     public HttpResponseResult<ImLiveBroadcastRoomVo> speakerJoinRoom(String roomUid) {
-        return succeed(imLiveBroadcastRoomService.speakerJoinRoom(roomUid));
+        return succeed(imLiveBroadcastRoomService.speakerJoinRoom(roomUid,"mobile"));
     }
 
     @GetMapping("/test")

+ 32 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherImLiveRoomVideoController.java

@@ -0,0 +1,32 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.biz.dal.entity.ImLiveRoomVideo;
+import com.ym.mec.biz.service.ImLiveRoomVideoService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Api(tags = "直播回放录像记录表")
+@RestController
+@RequestMapping("/imLiveRoomVideo")
+public class TeacherImLiveRoomVideoController extends BaseController {
+
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImLiveRoomVideoService imLiveRoomVideoService;
+
+    @ApiOperation("查询该机构目前推广的直播间")
+    @GetMapping(value = "/queryList")
+    public HttpResponseResult<List<ImLiveRoomVideo>> queryList(String roomUid) {
+        return succeed(imLiveRoomVideoService.queryList(roomUid));
+    }
+}

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java

@@ -174,7 +174,7 @@ public class ImLiveBroadcastRoomController extends BaseController {
     @ApiOperation("主讲人进入房间")
     @GetMapping("/speakerJoinRoom")
     public HttpResponseResult<ImLiveBroadcastRoomVo> speakerJoinRoom(String roomUid) {
-        return succeed(imLiveBroadcastRoomService.speakerJoinRoom(roomUid));
+        return succeed(imLiveBroadcastRoomService.speakerJoinRoom(roomUid, "pc"));
     }
 
     @ApiOperation("学生-进入房间")