소스 검색

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

zouxuan 1 년 전
부모
커밋
7d45d61961

+ 1 - 0
.gitignore

@@ -32,6 +32,7 @@ mvnw
 mvnw.cmd
 *.iws
 *.ipr
+*.http
 /codegen/src/main/resources/generateConfigration.xml
 **/bootstrap-dev.yml
 **/bootstrap-dev.properties

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderDao.java

@@ -9,6 +9,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -118,4 +119,10 @@ public interface CloudTeacherOrderDao extends BaseDAO<Long, CloudTeacherOrder> {
     List<Map<Integer,BigDecimal>> sumPersonalCloudAmount(@Param("month") String month,
                                                          @Param("firstDay") String firstDayOfMonth,
                                                          @Param("lastDay") String lastDayOfMonth);
+
+    int cancelInactiveCloudTeacher(@Param("idList") List<Integer> idList, @Param("cancelReason") String cancelReason,
+                                   @Param("operator") Integer operator, @Param("operateTime") Date operateTime,
+                                   @Param("tenantId") Integer tenantId);
+
+    List<CloudTeacherOrder> queryCloudTeacherOrderByIds(@Param("ids") List<Integer> ids);
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CloudTeacherCancel.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 取消云教练
+ */
+@ApiModel("取消云教练")
+@Data
+public class CloudTeacherCancel {
+
+    @ApiModelProperty("取消未激活的云教练,多个用逗号隔开")
+    private String ids;
+
+    @ApiModelProperty("取消原因")
+    private String cancelReason;
+
+}

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

@@ -73,7 +73,16 @@ public class CloudTeacherOrder {
 
     @ApiModelProperty(value = "乐团编号")
     private String musicGroupId;
-    
+
+    @ApiModelProperty(value = "操作人")
+    private Long operator;
+
+    @ApiModelProperty(value = "操作时间")
+    private Date operateTime;
+
+    @ApiModelProperty(value = "取消原因")
+    private String cancelReason;
+
     private StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
 
     private Integer tenantId = TenantContextHolder.getTenantId();

+ 56 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CloudTeacherStudent.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.enums.PeriodEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * Description
@@ -58,6 +59,21 @@ public class CloudTeacherStudent {
     @ApiModelProperty(value = "数量")
     private Integer time;
 
+    @ApiModelProperty(value = "状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "操作人")
+    private Integer operator;
+
+    @ApiModelProperty(value = "操作人名称")
+    private String operatorName;
+
+    @ApiModelProperty(value = "操作时间")
+    private Date operateTime;
+
+    @ApiModelProperty(value = "取消原因")
+    private String cancelReason;
+
     // ------------------------------------------------------------------------------------------
 
     public String getTransNo() {
@@ -180,4 +196,44 @@ public class CloudTeacherStudent {
     public void setAmount(BigDecimal amount) {
         this.amount = amount;
     }
+
+    public Integer getOperator() {
+        return operator;
+    }
+
+    public void setOperator(Integer operator) {
+        this.operator = operator;
+    }
+
+    public Date getOperateTime() {
+        return operateTime;
+    }
+
+    public void setOperateTime(Date operateTime) {
+        this.operateTime = operateTime;
+    }
+
+    public String getOperatorName() {
+        return operatorName;
+    }
+
+    public void setOperatorName(String operatorName) {
+        this.operatorName = operatorName;
+    }
+
+    public String getCancelReason() {
+        return cancelReason;
+    }
+
+    public void setCancelReason(String cancelReason) {
+        this.cancelReason = cancelReason;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
 }

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

@@ -12,6 +12,7 @@ public enum ReturnFeeEnum implements BaseEnum<String, ReturnFeeEnum> {
 	MUSIC("MUSIC", "乐团退团"),
 	GOODS("GOODS", "商品退费"),
 	SUBJECT_CHANGE("SUBJECT_CHANGE", "声部更换"),
+	MEMBER("MEMBER", "取消云教练"),
 	CANCEL_ACTIVITY_COURSE("CANCEL_ACTIVITY_COURSE", "取消活动排课");
 
 	private String code;

+ 37 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CloudTeacherOrderQueryInfo.java

@@ -13,8 +13,8 @@ public class CloudTeacherOrderQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "乐团Id")
 	private String musicGroupId;
 
-	@ApiModelProperty(value = "交易状态(0-待生效 1-生效中 2-已生效 3-已退)")
-	private Integer status;
+	@ApiModelProperty(value = "交易状态(0-待生效 1-生效中 2-已生效 3-已退 4-已取消,多个状态用逗号隔开)")
+	private String status;
 
 	@ApiModelProperty(value = "学生编号")
 	private Integer studentId;
@@ -35,6 +35,15 @@ public class CloudTeacherOrderQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "分部")
 	private String organIds;
 
+	@ApiModelProperty(value = "操作人")
+	private String operatorName;
+
+	@ApiModelProperty(value = "操作开始时间")
+	private Date operateStartTime;
+
+	@ApiModelProperty(value = "操作结束时间")
+	private Date operateEndTime;
+
 	public Date getStartTime() {
 		return startTime;
 	}
@@ -54,11 +63,11 @@ public class CloudTeacherOrderQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "结束时间")
 	private Date endTime;
 
-	public Integer getStatus() {
+	public String getStatus() {
 		return status;
 	}
 
-	public void setStatus(Integer status) {
+	public void setStatus(String status) {
 		this.status = status;
 	}
 
@@ -109,4 +118,28 @@ public class CloudTeacherOrderQueryInfo extends QueryInfo {
 	public void setOrganIds(String organIds) {
 		this.organIds = organIds;
 	}
+
+	public String getOperatorName() {
+		return operatorName;
+	}
+
+	public void setOperatorName(String operatorName) {
+		this.operatorName = operatorName;
+	}
+
+	public Date getOperateStartTime() {
+		return operateStartTime;
+	}
+
+	public void setOperateStartTime(Date operateStartTime) {
+		this.operateStartTime = operateStartTime;
+	}
+
+	public Date getOperateEndTime() {
+		return operateEndTime;
+	}
+
+	public void setOperateEndTime(Date operateEndTime) {
+		this.operateEndTime = operateEndTime;
+	}
 }

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

@@ -120,4 +120,6 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
     void save(CloudTeacherOrder cloudTeacherOrder,Boolean autoActivationFlag);
 
     CloudTeacherOrder queryByOrderId(Long orderId);
+
+    Boolean cancelInactive(CloudTeacherCancel cloudTeacherCancel,Integer tenantId);
 }

+ 67 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java

@@ -3,19 +3,25 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
 import com.ym.mec.biz.dal.dto.Mapper;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
+import com.ym.mec.biz.dal.enums.ReturnFeeEnum;
 import com.ym.mec.biz.dal.enums.TenantOrderRecordEnum;
 import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
 import com.ym.mec.biz.service.*;
 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.page.WrapperUtil;
 import com.ym.mec.common.service.IdGeneratorService;
@@ -24,6 +30,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import jodd.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +41,8 @@ import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.ym.mec.biz.dal.enums.GroupType.GOODS_SELL;
+import static com.ym.mec.biz.dal.enums.GroupType.MEMBER;
 import static com.ym.mec.biz.dal.enums.PeriodEnum.*;
 
 @Service
@@ -59,6 +68,15 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     @Autowired
     private SysConfigDao sysConfigDao;
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private EmployeeDao employeeDao;
+
+    @Autowired
+    private SysUserCashAccountLogService sysUserCashAccountLogService;
+
     @Override
     public BaseDAO<Long, CloudTeacherOrder> getDAO() {
         return cloudTeacherOrderDao;
@@ -115,7 +133,18 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
             return pageInfo;
         }
         assert dataList != null;
+
+        Map<Integer, SimpleUserDto> empMapById = new HashMap<>();
+        List<Integer> operatorIdList = dataList.stream().map(CloudTeacherStudent::getOperator)
+                .distinct().collect(Collectors.toList());
+        if (!operatorIdList.isEmpty()) {
+            List<SimpleUserDto> byIds = employeeDao.findByIds(operatorIdList);
+            byIds.forEach(next -> empMapById.put(next.getUserId(), next));
+        }
         for (CloudTeacherStudent cst : dataList) {
+            if (cst.getOperator() != null) {
+                cst.setOperatorName(empMapById.getOrDefault(cst.getOperator(), new SimpleUserDto()).getUserName());
+            }
             TenantConfig tenantConfig = tenantConfigService.getOne(new QueryWrapper<TenantConfig>().eq("tenant_id_", cst.getTenantId()));
             if (tenantConfig == null) {
                 throw new Exception("未找到组织Id " + cst.getTenantId().toString() + "在 TenantConfig 表");
@@ -164,6 +193,10 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
             throw new Exception("存在已经支付完成的学生,请重新选择");
         }
         Integer tenantId = null;
+        List<CloudTeacherOrder> cloudTeacherOrders = cloudTeacherOrderDao.queryCloudTeacherOrderByIds(ids);
+        if (cloudTeacherOrders.stream().filter(next -> next.getStatus() == 4).collect(Collectors.toSet()).size() > 0) {
+            throw new Exception("存在已取消的学生,请重新选择");
+        }
         BigDecimal sumAmount = new BigDecimal(0);
         for (CloudTeacherStudent cts : cloudTeacherStudents) {
             if (cts.getAmount() == null) {
@@ -353,4 +386,38 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     public String queryActiveOrderPage(Integer userId, Integer activeRemark, String remark) {
         return cloudTeacherOrderDao.queryActiveOrderPage(userId, activeRemark, remark);
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean cancelInactive(CloudTeacherCancel cloudTeacherCancel,Integer tenantId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("登录失效,请重新登录");
+        }
+        String ids = cloudTeacherCancel.getIds();
+        if (StringUtils.isEmpty(ids)) {
+            throw new BizException("未指定删除云教练");
+        }
+
+        List<Integer> idList = Arrays.stream(ids.split(",")).map(Integer::valueOf).collect(Collectors.toList());
+        int cancelNum = cloudTeacherOrderDao.cancelInactiveCloudTeacher(idList, cloudTeacherCancel.getCancelReason(),
+                sysUser.getId(), new Date(), tenantId);
+        if (cancelNum != idList.size()) {
+            throw new BizException("数据已更新,请刷新后重试");
+        }
+        List<CloudTeacherOrder> cloudTeacherOrders = cloudTeacherOrderDao.queryCloudTeacherOrderByIds(idList);
+        cloudTeacherOrders.stream().filter(next -> next.getAmount().compareTo(new BigDecimal(0)) != 0).forEach(next -> {
+            SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+            sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.MEMBER);
+            sysUserCashAccountLog.setOrganId(next.getOrganId());
+            sysUserCashAccountLog.setUserId(next.getStudentId());
+            sysUserCashAccountLog.setGroupType(MEMBER);
+            sysUserCashAccountLog.setComment(ReturnFeeEnum.MEMBER.getMsg());
+            sysUserCashAccountLog.setGroupId(String.valueOf(next.getId()));
+            sysUserCashAccountLog.setAmount(next.getAmount());
+            sysUserCashAccountLogService.insert(sysUserCashAccountLog);
+        });
+
+        return true;
+    }
 }

+ 48 - 2
mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml

@@ -331,6 +331,10 @@
                cto.tenant_id_ as tenantId,
                u.username_ as name,
                u.phone_ as phone
+               ,cto.status_ as status
+               ,cto.operator_ as operator
+               ,cto.operate_time_ as operateTime
+               ,cto.cancel_reason_ as cancelReason
         from cloud_teacher_order cto
         left join student s on cto.student_id_ = s.user_id_
         left join sys_user u on cto.student_id_ = u.id_
@@ -339,7 +343,7 @@
             left join student_registration sr ON cto.student_id_ = sr.user_id_
         </if>
         <where>
-            cto.status_ = #{status} AND cto.tenant_id_ = #{tenantId}
+            FIND_IN_SET(cto.status_,#{status}) AND cto.tenant_id_ = #{tenantId}
             <if test="organIds != null and organIds != ''">
                 AND FIND_IN_SET(u.organ_id_ , #{organIds})
             </if>
@@ -352,6 +356,18 @@
             <if test="subjectId">
                 AND (s.subject_id_list_ = #{subjectId})
             </if>
+            <if test="operatorName != null and operatorName.trim() != ''">
+                AND cto.operator_ in (
+                select id_ from sys_user where real_name_ like concat('%',#{operatorName},'%')
+                union select -1 from sys_user
+                )
+            </if>
+            <if test="operateStartTime != null">
+                AND cto.operate_time_ >= #{operateStartTime}
+            </if>
+            <if test="operateEndTime != null">
+                AND #{operateEndTime} >= cto.operate_time_
+            </if>
         </where>
         ORDER BY cto.id_ DESC
         <include refid="global.limit"/>
@@ -366,7 +382,7 @@
             left join student_registration sr ON cto.student_id_ = sr.user_id_
         </if>
         <where>
-            cto.status_ = #{status} AND cto.tenant_id_ = #{tenantId}
+            FIND_IN_SET(cto.status_,#{status}) AND cto.tenant_id_ = #{tenantId}
             <if test="organIds != null and organIds != ''">
                 AND FIND_IN_SET(u.organ_id_ , #{organIds})
             </if>
@@ -379,6 +395,18 @@
             <if test="subjectId">
                 AND (s.subject_id_list_ = #{subjectId})
             </if>
+            <if test="operatorName != null and operatorName.trim() != ''">
+                AND cto.operator_ in (
+                select id_ from sys_user where real_name_ like concat('%',#{operatorName},'%')
+                union select -1 from sys_user
+                )
+            </if>
+            <if test="operateStartTime != null">
+                AND cto.operate_time_ >= #{operateStartTime}
+            </if>
+            <if test="operateEndTime != null">
+                AND #{operateEndTime} >= cto.operate_time_
+            </if>
         </where>
     </select>
 
@@ -520,4 +548,22 @@
           AND cto.settlement_report_flag_ = 0 AND cto.status_ = 2
         group by cto.organ_id_
     </select>
+
+    <update id="cancelInactiveCloudTeacher">
+        update cloud_teacher_order
+        set operator_ = #{operator}, status_=4 ,cancel_reason_=#{cancelReason},operate_time_=#{operateTime}
+        where id_ in
+        <foreach collection="idList" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        and status_ = 1 and tenant_id_ = #{tenantId}
+    </update>
+
+    <select id="queryCloudTeacherOrderByIds" resultMap="CloudTeacherOrder">
+        select t.* from cloud_teacher_order t
+        where t.id_ in
+            <foreach collection="ids" item="item" close=")" open="(" separator=",">
+                #{item}
+            </foreach>
+    </select>
 </mapper>

+ 14 - 2
mec-web/src/main/java/com/ym/mec/web/controller/CloudTeacherOrderController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.dal.entity.CloudTeacherCancel;
 import com.ym.mec.biz.dal.entity.CloudTeacherStudent;
 import com.ym.mec.biz.dal.page.CloudTeacherAddQueryInfo;
 import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
@@ -11,6 +12,7 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+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.*;
@@ -49,7 +51,9 @@ public class CloudTeacherOrderController extends BaseController {
         Integer tenantId = TenantContextHolder.getTenantId();
         cloudTeacherOrderQueryInfo.setTenantId(tenantId);
         String organIds = organizationService.getEmployeeOrgan("");
-        cloudTeacherOrderQueryInfo.setStatus(1);
+        if (StringUtils.isEmpty(cloudTeacherOrderQueryInfo.getStatus())) {
+            cloudTeacherOrderQueryInfo.setStatus("1,4");
+        }
         cloudTeacherOrderQueryInfo.setOrganIds(organIds); // 1,2,34,
         return succeed(cloudTeacherOrderService.queryInactive(cloudTeacherOrderQueryInfo));
     }
@@ -60,7 +64,7 @@ public class CloudTeacherOrderController extends BaseController {
     public HttpResponseResult<PageInfo<CloudTeacherStudent>> queryActive(@RequestBody CloudTeacherOrderQueryInfo cloudTeacherOrderQueryInfo) throws Exception {
         Integer tenantId = TenantContextHolder.getTenantId();
         cloudTeacherOrderQueryInfo.setTenantId(tenantId);
-        cloudTeacherOrderQueryInfo.setStatus(2);
+        cloudTeacherOrderQueryInfo.setStatus("2");
         return succeed(cloudTeacherOrderService.queryInactive(cloudTeacherOrderQueryInfo));
     }
 
@@ -86,4 +90,12 @@ public class CloudTeacherOrderController extends BaseController {
     public HttpResponseResult<Boolean> payCheck(@RequestParam String orderNo) {
         return succeed(cloudTeacherOrderService.payCheck(orderNo));
     }
+
+    @ApiOperation(value = "取消未激活的团练宝用户")
+    @PostMapping("/cancelInactive")
+    @PreAuthorize("@pcs.hasPermissions('cloudTeacherOrder/cancelInactive')")
+    public HttpResponseResult<Boolean> cancelInactive(@RequestBody CloudTeacherCancel cloudTeacherCancel) {
+        Integer tenantId = TenantContextHolder.getTenantId();
+        return succeed(cloudTeacherOrderService.cancelInactive(cloudTeacherCancel,tenantId));
+    }
 }