935090232@qq.com
2022-03-13 76ed413ae6fd573996207760904304b4951df5d5
重构:套餐项目
8 files added
1 files renamed
15 files modified
2020 ■■■■■ changed files
zq-erp/src/main/java/com/matrix/core/pojo/VerificationResult.java 18 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/validate/HDValidateResult.java 213 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidate.java 136 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidateFailNoFast.java 134 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/validate/beans/ErrorMessage.java 44 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/validate/group/Group.java 44 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/OutStoreController.java 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardOperationDto.java 62 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardPayDto.java 6 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dto/ProjUseOperationDto.java 71 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java 18 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java 3 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysOutStoreService.java 7 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java 9 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java 185 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceHelper.java 175 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java 655 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOutStoreServiceImpl.java 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java 185 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/validation/ProjUseGroup.java 19 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java 9 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html 13 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/core/pojo/VerificationResult.java
@@ -22,6 +22,24 @@
    }
    public static VerificationResult success(){
         return  buildVerificationResult(true);
    }
    public static VerificationResult success(String msg){
         return  buildVerificationResult(true,msg);
    }
    public static VerificationResult fail(){
        return  buildVerificationResult(false);
    }
    public static VerificationResult fail(String msg){
        return  buildVerificationResult(false,msg);
    }
    public static VerificationResult buildVerificationResult(boolean judgeResult){
        VerificationResult obj=new VerificationResult();
        obj.judgeResult =judgeResult;
zq-erp/src/main/java/com/matrix/system/common/validate/HDValidateResult.java
New file
@@ -0,0 +1,213 @@
/**
 * projectName: h3-organization
 * fileName: HDValidateResult.java
 * packageName: com.hydee.common.validate
 * date: 2019-06-17 14:46
 * copyright(c) 2019 http://www.hydee.cn/ Inc. All rights reserved.
 */
package com.matrix.system.common.validate;
import org.springframework.beans.PropertyEditorRegistry;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import java.beans.PropertyEditor;
import java.util.List;
import java.util.Map;
/**
 * @version: V1.0
 * @author: LiHengye
 * @className: HDValidateResult
 * @packageName: com.hydee.common.validate
 * @description: 校验结果
 * @data: 2019-06-17 14:46
 **/
public class HDValidateResult implements BindingResult {
    @Override
    public Object getTarget() {
        return null;
    }
    @Override
    public Map<String, Object> getModel() {
        return null;
    }
    @Override
    public Object getRawFieldValue(String s) {
        return null;
    }
    @Override
    public PropertyEditor findEditor(String s, Class<?> aClass) {
        return null;
    }
    @Override
    public PropertyEditorRegistry getPropertyEditorRegistry() {
        return null;
    }
    @Override
    public String[] resolveMessageCodes(String s) {
        return new String[0];
    }
    @Override
    public String[] resolveMessageCodes(String s, String s1) {
        return new String[0];
    }
    @Override
    public void addError(ObjectError objectError) {
    }
    @Override
    public String getObjectName() {
        return null;
    }
    @Override
    public void setNestedPath(String s) {
    }
    @Override
    public String getNestedPath() {
        return null;
    }
    @Override
    public void pushNestedPath(String s) {
    }
    @Override
    public void popNestedPath() throws IllegalStateException {
    }
    @Override
    public void reject(String s) {
    }
    @Override
    public void reject(String s, String s1) {
    }
    @Override
    public void reject(String s, Object[] objects, String s1) {
    }
    @Override
    public void rejectValue(String s, String s1) {
    }
    @Override
    public void rejectValue(String s, String s1, String s2) {
    }
    @Override
    public void rejectValue(String s, String s1, Object[] objects, String s2) {
    }
    @Override
    public void addAllErrors(Errors errors) {
    }
    @Override
    public boolean hasErrors() {
        return false;
    }
    @Override
    public int getErrorCount() {
        return 0;
    }
    @Override
    public List<ObjectError> getAllErrors() {
        return null;
    }
    @Override
    public boolean hasGlobalErrors() {
        return false;
    }
    @Override
    public int getGlobalErrorCount() {
        return 0;
    }
    @Override
    public List<ObjectError> getGlobalErrors() {
        return null;
    }
    @Override
    public ObjectError getGlobalError() {
        return null;
    }
    @Override
    public boolean hasFieldErrors() {
        return false;
    }
    @Override
    public int getFieldErrorCount() {
        return 0;
    }
    @Override
    public List<FieldError> getFieldErrors() {
        return null;
    }
    @Override
    public FieldError getFieldError() {
        return null;
    }
    @Override
    public boolean hasFieldErrors(String s) {
        return false;
    }
    @Override
    public int getFieldErrorCount(String s) {
        return 0;
    }
    @Override
    public List<FieldError> getFieldErrors(String s) {
        return null;
    }
    @Override
    public FieldError getFieldError(String s) {
        return null;
    }
    @Override
    public Object getFieldValue(String s) {
        return null;
    }
    @Override
    public Class<?> getFieldType(String s) {
        return null;
    }
}
zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidate.java
New file
@@ -0,0 +1,136 @@
/**
 * projectName: h3-organization
 * fileName: ParameterValidate.java
 * packageName: com.hydee.common.validate
 * date: 2019-06-17 10:48
 * copyright(c) 2019 http://www.hydee.cn/ Inc. All rights reserved.
 */
package com.matrix.system.common.validate;
import com.matrix.system.common.validate.beans.ErrorMessage;
import com.matrix.system.common.validate.group.Group;
import org.hibernate.validator.HibernateValidator;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
 * @version: V1.0
 * @author: LiHengye
 * @className: ParameterValidate
 * @packageName: com.hydee.common.validate
 * @description: 参数验证
 * @data: 2019-06-17 10:48
 **/
public class ParameterValidate {
    /**
     * 开启快速结束模式 failFast (true)
     */
    private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();
    /**
     * 校验对象
     * @param t bean
     * @param groups 校验组
     * @return ValidResult
     */
    public static <T> ValidResult validateBean(T t,Class<?>...groups) {
        ValidResult result = new ValidResult();
        Set<ConstraintViolation<T>> violationSet = validator.validate(t,groups);
        boolean hasError = violationSet != null && violationSet.size() > 0;
        result.setHasErrors(hasError);
        if (hasError) {
            for (ConstraintViolation<T> violation : violationSet) {
                result.addError(violation.getPropertyPath().toString(), violation.getMessageTemplate());
            }
        }
        return result;
    }
    /**
     * 校验bean的某一个属性
     * @param obj          bean
     * @param propertyName 属性名称
     * @return ValidResult
     */
    public static <T> ValidResult validateProperty(T obj, String propertyName) {
        ValidResult result = new ValidResult();
        Set<ConstraintViolation<T>> violationSet = validator.validateProperty(obj, propertyName, Group.ADD.class);
        boolean hasError = violationSet != null && violationSet.size() > 0;
        result.setHasErrors(hasError);
        if (hasError) {
            for (ConstraintViolation<T> violation : violationSet) {
                result.addError(propertyName, violation.getMessage());
            }
        }
        return result;
    }
    /**
     * 校验结果类
     */
    public static class ValidResult {
        /**
         * 是否有错误
         */
        private boolean hasErrors;
        /**
         * 错误信息
         */
        private List<ErrorMessage> errors;
        public ValidResult() {
            this.errors = new ArrayList<>();
        }
        public boolean hasErrors() {
            return hasErrors;
        }
        public void setHasErrors(boolean hasErrors) {
            this.hasErrors = hasErrors;
        }
        /**
         * 获取所有验证信息
         * @return 集合形式
         */
        public List<ErrorMessage> getAllErrors() {
            return errors;
        }
        /**
         * 获取所有验证信息
         * @return 字符串形式
         */
        public String getErrors(){
            StringBuilder sb = new StringBuilder();
            for (ErrorMessage error : errors) {
                sb.append(error.getPropertyPath()).append(":不能为空");
//                sb.append(error.getPropertyPath()).append(":").append(error.getMessage()).append(" ");
            }
            return sb.toString();
        }
        public String getAllErrorMessage(){
            StringBuilder sb = new StringBuilder();
            for (ErrorMessage error : errors) {
                if(error.getMessage() == null || error.getMessage().isEmpty()){
                    sb.append(error.getPropertyPath()).append(":不合法!");
                }else{
                    sb.append(error.getPropertyPath()).append(":").append(error.getMessage()).append(" ");
                }
            }
            return sb.toString();
        }
        public void addError(String propertyPath, String message) {
            this.errors.add(new ErrorMessage(propertyPath, message));
        }
    }
}
zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidateFailNoFast.java
New file
@@ -0,0 +1,134 @@
/**
 * projectName: common
 * fileName: ParameterValidateFailNoFast.java
 * packageName: com.hydee.common.validate
 * date: 2021-04-22 9:25 上午
 * copyright(c) 2021 http://www.hydee.cn/ Inc. All rights reserved.
 */
package com.matrix.system.common.validate;
import com.matrix.system.common.validate.beans.ErrorMessage;
import com.matrix.system.common.validate.group.Group;
import org.hibernate.validator.HibernateValidator;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
 * @version: V1.0
 * @author: LiHengye
 * @className: ParameterValidateFailNoFast
 * @packageName: com.hydee.common.validate
 * @description: 参数校验遇到错误非立刻返回
 * @data: 2021-04-22 9:25 上午
 **/
public class ParameterValidateFailNoFast {
    /**
     * 开启快速结束模式 failFast (true)
     */
    private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator();
    /**
     * 校验对象
     * @param t bean
     * @param groups 校验组
     * @return ValidResult
     */
    public static <T> ValidResult validateBean(T t, Class<?>...groups) {
        ValidResult result = new ValidResult();
        Set<ConstraintViolation<T>> violationSet = validator.validate(t,groups);
        boolean hasError = violationSet != null && violationSet.size() > 0;
        result.setHasErrors(hasError);
        if (hasError) {
            for (ConstraintViolation<T> violation : violationSet) {
                result.addError(violation.getPropertyPath().toString(), violation.getMessageTemplate());
            }
        }
        return result;
    }
    /**
     * 校验bean的某一个属性
     * @param obj          bean
     * @param propertyName 属性名称
     * @return ValidResult
     */
    public static <T> ValidResult validateProperty(T obj, String propertyName) {
        ValidResult result = new ValidResult();
        Set<ConstraintViolation<T>> violationSet = validator.validateProperty(obj, propertyName, Group.ADD.class);
        boolean hasError = violationSet != null && violationSet.size() > 0;
        result.setHasErrors(hasError);
        if (hasError) {
            for (ConstraintViolation<T> violation : violationSet) {
                result.addError(propertyName, violation.getMessage());
            }
        }
        return result;
    }
    /**
     * 校验结果类
     */
    public static class ValidResult {
        /**
         * 是否有错误
         */
        private boolean hasErrors;
        /**
         * 错误信息
         */
        private List<ErrorMessage> errors;
        public ValidResult() {
            this.errors = new ArrayList<>();
        }
        public boolean hasErrors() {
            return hasErrors;
        }
        public void setHasErrors(boolean hasErrors) {
            this.hasErrors = hasErrors;
        }
        /**
         * 获取所有验证信息
         * @return 集合形式
         */
        public List<ErrorMessage> getAllErrors() {
            return errors;
        }
        /**
         * 获取所有验证信息
         * @return 字符串形式
         */
        public String getErrors(){
            StringBuilder sb = new StringBuilder();
            for (ErrorMessage error : errors) {
                sb.append(error.getPropertyPath()).append(":").append(error.getMessage()).append(" /");
            }
            return sb.toString();
        }
        public String getAllErrorMessage(){
            StringBuilder sb = new StringBuilder();
            for (ErrorMessage error : errors) {
                if(error.getMessage() == null || error.getMessage().isEmpty()){
                    sb.append(error.getPropertyPath()).append(":不合法!");
                }else{
                    sb.append(error.getPropertyPath()).append(":").append(error.getMessage()).append(" ");
                }
            }
            return sb.toString();
        }
        public void addError(String propertyPath, String message) {
            this.errors.add(new ErrorMessage(propertyPath, message));
        }
    }
}
zq-erp/src/main/java/com/matrix/system/common/validate/beans/ErrorMessage.java
New file
@@ -0,0 +1,44 @@
/**
 * projectName: h3-organization
 * fileName: ErrorMessage.java
 * packageName: com.hydee.common.validate.beans
 * date: 2019-06-17 10:42
 * copyright(c) 2019 http://www.hydee.cn/ Inc. All rights reserved.
 */
package com.matrix.system.common.validate.beans;
/**
 * @version: V1.0
 * @author: LiHengye
 * @className: ErrorMessage
 * @packageName: com.hydee.common.validate.beans
 * @description: 错误信息
 * @data: 2019-06-17 10:42
 **/
public class ErrorMessage {
    private String propertyPath;
    private String message;
    public ErrorMessage(String propertyPath, String message) {
        this.propertyPath = propertyPath;
        this.message = message;
    }
    public String getPropertyPath() {
        return propertyPath;
    }
    public void setPropertyPath(String propertyPath) {
        this.propertyPath = propertyPath;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}
zq-erp/src/main/java/com/matrix/system/common/validate/group/Group.java
New file
@@ -0,0 +1,44 @@
/**
 * projectName: h3-organization
 * fileName: Group.java
 * packageName: group
 * date: 2019-06-17 10:43
 * copyright(c) 2019 http://www.hydee.cn/ Inc. All rights reserved.
 */
package com.matrix.system.common.validate.group;
/**
 * @version: V1.0
 * @author: LiHengye
 * @className: Group
 * @packageName: group
 * @description: 验证信息组
 * @data: 2019-06-17 10:43
 **/
public interface Group {
    /**
     * 默认分组
     */
    static interface Default{}
    /**
     * 新增分组
     */
    static interface ADD{}
    /**
     * 修改分组
     */
    static interface MODIFY{}
    /**
     * 删除分组
     */
    static interface DELETE{}
    /**
     * 查询分组
     */
    static interface SELECT{}
}
zq-erp/src/main/java/com/matrix/system/hive/action/OutStoreController.java
@@ -133,7 +133,7 @@
        int i=0;
        if (sysOutStore.getId() != null) {
            i=currentService.checkInfo(sysOutStore);
            i=currentService.effectOutStore(sysOutStore);
        }
        if(i>0){
            return new AjaxResult(AjaxResult.STATUS_SUCCESS,  "审核成功!");
zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java
@@ -243,7 +243,7 @@
    private Integer carMaxSaleCount;
    /**
     * 是一卡通吗
     * 充值卡使用范围 是否所有产品
     */
    private String carIsAll;
zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java
@@ -90,7 +90,7 @@
    int selectShopppingGoodsAipTotal(@Param("record") ShoppingGoodsListDto shoppingGoodsListDto);
    public List<ShoppingGoods> selectByIds(@Param("ids")List<Integer> ids);
    public List<ShoppingGoods> selectByIds(@Param("ids")List<Long> ids);
    int updateInvalidProduct();
}
zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardOperationDto.java
New file
@@ -0,0 +1,62 @@
/**
 * projectName: zq-erp
 * fileName: MoneyCardChangeDto.java
 * packageName: com.matrix.system.hive.dto
 * date: 2022-03-11 10:24
 * copyright(c) 2022 http://www.hydee.cn/ Inc. All rights reserved.
 */
package com.matrix.system.hive.dto;
import com.matrix.system.common.validate.group.Group;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * @version: V1.0
 * @author: JiangYouYao
 * @className: MoneyCardChangeDto
 * @packageName: com.matrix.system.hive.dto
 * @description: 储值卡操作DTO
 * @data: 2022-03-11 10:24
 **/
@Data
public class MoneyCardOperationDto {
    /**
     * 储值卡id
     */
    private Long carUseId;
    /**
     * 会员id
     */
    @NotNull(groups = Group.ADD.class)
    private Long vipId;
    /**
     * 来源,购买,转让,赠送
     */
    @NotNull(groups = Group.ADD.class)
    private String source;
    /**
     * 订单明细id
     */
    @NotNull(groups = Group.ADD.class)
    private Long orderItemId;
    /**
     * 充值卡的id
     */
    @NotNull(groups = Group.ADD.class)
    private Long goodsId;
    /**
     * 备注
     */
    private String remark;
}
zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardPayDto.java
File was renamed from zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardChangeDto.java
@@ -16,11 +16,11 @@
 * @author: JiangYouYao
 * @className: MoneyCardChangeDto
 * @packageName: com.matrix.system.hive.dto
 * @description: 储值卡余额变更DTO
 * @description: 储值卡余额支付DTO
 * @data: 2022-03-11 10:24
 **/
@Data
public class MoneyCardChangeDto {
public class MoneyCardPayDto {
    /**
@@ -50,7 +50,7 @@
    /**
     * 扣减次数
     */
    private Double count;
    private Integer count;
    /**
     * 操作人
     */
zq-erp/src/main/java/com/matrix/system/hive/dto/ProjUseOperationDto.java
New file
@@ -0,0 +1,71 @@
package com.matrix.system.hive.dto;
import com.matrix.system.hive.validation.ProjUseGroup;
import io.swagger.models.auth.In;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * 项目操作对象
 */
@Data
public class ProjUseOperationDto {
    /**
     * 客户id
     */
    @NotNull(groups = {ProjUseGroup.addProject.class, ProjUseGroup.addTc.class})
    private Long vipId;
    /**
     * 产品id
     */
    @NotNull(groups = {ProjUseGroup.addProject.class, ProjUseGroup.addTc.class})
    private Long goodsId;
    /**
     * 添加次数
     */
    @NotNull(groups = {ProjUseGroup.addProject.class, ProjUseGroup.addTc.class})
    private Integer count;
    /**
     * 购买支付金额
     */
    @NotNull(groups = {ProjUseGroup.addProject.class, ProjUseGroup.addTc.class})
    private Double payMoney;
    /**
     * 备注
     */
    private String remark;
    /**
     * 订单明细id
     */
    @NotNull(groups = {ProjUseGroup.addProject.class, ProjUseGroup.addTc.class})
    private Long orderItemId;
    /**
     * 是否为赠送
     */
    @NotNull(groups = {ProjUseGroup.addProject.class, ProjUseGroup.addTc.class})
    private boolean isFree;
    /**
     * 套餐折扣
     * 设置折扣后,套餐下绑定的项目消耗金额会对应打折
     * -- 套餐类型必传
     */
    @NotNull(groups = {ProjUseGroup.addTc.class})
    private Double tcZk;
    /**
     * 所属套餐id
     * -- 添加套餐下的项目必传
     */
    private Long tcId;
}
zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java
@@ -2,7 +2,8 @@
import com.matrix.core.pojo.PaginationVO;
import com.matrix.system.hive.bean.MoneyCardUse;
import com.matrix.system.hive.dto.MoneyCardChangeDto;
import com.matrix.system.hive.dto.MoneyCardOperationDto;
import com.matrix.system.hive.dto.MoneyCardPayDto;
import com.matrix.system.hive.plugin.util.BaseServices;
import java.util.List;
@@ -16,15 +17,20 @@
    /**
     * 修改储值卡余额
     */
    void changeMoneyCard(List<MoneyCardChangeDto> moneyCardChangeDtoList);
    void changeMoneyCard(List<MoneyCardPayDto> moneyCardPayDtoList);
    /**
     * 新增MoneyCardUse
     * 新增用户储值卡
     * @param moneyCardOperationDtos
     */
    public void addVipMoneyCard(List<MoneyCardOperationDto> moneyCardOperationDtos) ;
        /**
         * 新增MoneyCardUse
         */
    public int add(MoneyCardUse moneyCardUse);
    /**
zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java
@@ -116,11 +116,8 @@
    public SysOrder updateAddCardMoney(CzXkVo czVo);
    public void addMoneyCardUse(SysOrder sourceOrder);
    public void addOutStore(SysOrder sourceOrder);
    public void addTaocanProj(SysOrder sourceOrder);
    public void setShopSelCount(SysOrder sourceOrder);
zq-erp/src/main/java/com/matrix/system/hive/service/SysOutStoreService.java
@@ -60,7 +60,12 @@
     */
    public SysOutStore  findById(Long id);
    public int checkInfo(SysOutStore sysOutStore);
    /**
     * 出库单审核通过,并扣减库存
     * @param sysOutStore
     * @return
     */
    public int effectOutStore(SysOutStore sysOutStore);
       
zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java
@@ -4,6 +4,7 @@
import com.matrix.core.pojo.PaginationVO;
import com.matrix.system.hive.bean.MoneyCardUse;
import com.matrix.system.hive.bean.SysProjUse;
import com.matrix.system.hive.dto.ProjUseOperationDto;
import com.matrix.system.hive.plugin.util.BaseServices;
import java.util.List;
@@ -135,7 +136,13 @@
     */
    public AjaxResult activeProj(SysProjUse proj);
    /**
     * 添加用户套餐和项目
     *
     * @param projUseDtoList
     * @return
     */
    public void addUserProjUse(List<ProjUseOperationDto> projUseDtoList) ;
    public int updateProjUseTck(SysProjUse projUse);
zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
@@ -1,28 +1,36 @@
package com.matrix.system.hive.service.imp;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.pojo.PaginationVO;
import com.matrix.core.pojo.VerificationResult;
import com.matrix.core.tools.DateUtil;
import com.matrix.system.common.validate.ParameterValidate;
import com.matrix.system.common.validate.group.Group;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.*;
import com.matrix.system.hive.dto.MoneyCardChangeDto;
import com.matrix.system.hive.dto.MoneyCardOperationDto;
import com.matrix.system.hive.dto.MoneyCardPayDto;
import com.matrix.system.hive.plugin.util.MoneyUtil;
import com.matrix.system.hive.service.MoneyCardUseService;
import com.matrix.system.hive.service.ShoppingGoodsService;
import com.matrix.system.hive.validation.ProjUseGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * @date 2016-09-17 10:17
 */
@Service("moneyCardUseService")
public class MoneyCardUseServiceImpl extends ServiceImpl<MoneyCardUseDao,MoneyCardUse> implements MoneyCardUseService {
public class MoneyCardUseServiceImpl extends ServiceImpl<MoneyCardUseDao, MoneyCardUse> implements MoneyCardUseService {
    @Autowired
@@ -45,64 +53,176 @@
    @Autowired
    MoneyCardAssembleDao moneyCardAssembleDao;
    @Autowired
    MoneyCardUseFlowDao moneyCardUseFlowDao;
    @Autowired
    private ShoppingGoodsService shoppingGoodsService;
    @Override
    public void changeMoneyCard(List<MoneyCardChangeDto> moneyCardChangeDtoList) {
    @Transactional(rollbackFor = Exception.class)
    public void addVipMoneyCard(List<MoneyCardOperationDto> moneyCardOperationDtos) {
        moneyCardOperationDtos.forEach(dto->{
            //参数校验
            ParameterValidate.ValidResult baseIdResult = ParameterValidate.validateBean(dto, Group.ADD.class);
            if (baseIdResult.hasErrors()) {
                throw new GlobleException(baseIdResult.getErrors());
            }
            ShoppingGoods moneyCar = shoppingGoodsDao.selectById(dto.getGoodsId());
            MoneyCardUse moneyCardUse = new MoneyCardUse();
            BeanUtil.copyProperties(dto,moneyCardUse);
            moneyCardUse.setVipId(dto.getVipId());
            moneyCardUse.setGiftMoney(moneyCar.getReferencePice());
            moneyCardUse.setRealMoney(moneyCar.getSealPice());
            moneyCardUse.setGoodsId(moneyCar.getId());
            moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
            moneyCardUse.setIsVipCar(Dictionary.FLAG_NO_N);
        // 判断商品是否在充值卡的限制购买,判断分类
        moneyCardChangeDtoList.forEach(cardUse->{
            VerificationResult verificationResult = checkIsBangding(cardUse, cardUse.getGoodsIds());
            //余次处理
            if (moneyCar.getCarUseCount() == null || moneyCar.getCarUseCount() == 0) {
                moneyCardUse.setUseTotal(999999999);
                moneyCardUse.setLastCount(999999999);
            } else {
                moneyCardUse.setUseTotal(moneyCar.getCarUseCount());
                moneyCardUse.setLastCount(moneyCar.getCarUseCount());
            }
            //失效时间处理
            Date invalidTime = shoppingGoodsService.calInvalidTime(moneyCar, 1, null);
            moneyCardUse.setFailTime(invalidTime);
            moneyCardUseDao.insert(moneyCardUse);
        });
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void changeMoneyCard(List<MoneyCardPayDto> moneyCardPayDtoList) {
        // 判断商品是否在充值卡的限制购买
        moneyCardPayDtoList.forEach(cardUse -> {
            VerificationResult verificationResult = checkIsBangding(cardUse.getCarUseId(), cardUse.getGoodsIds());
            if (!verificationResult.isJudgeResult()) {
                throw new GlobleException(verificationResult.getMsg());
            }
        });
        moneyCardChangeDtoList.get().forEach(item -> {
            if (!isInBangding(moneyCardUse, item.getGoodsId())) {
                throw new GlobleException(shoppingGoodsDao.selectById(item.getGoodsId()).getName() + "不在" + moneyCardUse.getCardName() + "优惠中");
        moneyCardPayDtoList.forEach(moneyCardPayDto -> {
            MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardPayDto.getCarUseId());
            MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow();
            if (Objects.nonNull(moneyCardPayDto.getGiftMoney()) && moneyCardPayDto.getGiftMoney()>0) {
                if (moneyCardUse.getGiftMoney() >= moneyCardPayDto.getGiftMoney()) {
                    double surplus = MoneyUtil.sub(moneyCardUse.getGiftMoney(), moneyCardPayDto.getGiftMoney());
                    moneyCardUse.setGiftMoney(surplus);
                    moneyCardUseFlow.setGiftMoney(0D - moneyCardPayDto.getGiftMoney());
                } else {
                    throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
                }
            } else {
                if (moneyCardUse.getRealMoney() >= moneyCardPayDto.getRealMoney()) {
                    double surplus = MoneyUtil.sub(moneyCardUse.getRealMoney(),  moneyCardPayDto.getRealMoney());
                    moneyCardUse.setRealMoney(surplus);
                    moneyCardUseFlow.setTotal(0 -  moneyCardPayDto.getRealMoney());
                } else {
                    throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
                }
            }
            if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_NO_N)) {
                //余额为0时充值卡变为无效
                if (moneyCardUse.getRealMoney().equals(0D) && moneyCardUse.getGiftMoney().equals(0D)) {
                    moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y);
                    moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX);
                }
            }
            ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId());
            if (shoppingGoods != null) {
                Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 2, moneyCardUse.getFailTime());
                moneyCardUse.setFailTime(invalidTime);
            }
            moneyCardUse.setLastCount(moneyCardUse.getLastCount() - moneyCardPayDto.getCount());
            // 更新充值卡信息
            moneyCardUseDao.update(moneyCardUse);
            //设置卡项使用流水
            moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
            moneyCardUseFlow.setOrderNo(moneyCardPayDto.getOrderNo());
            moneyCardUseFlow.setVipId(moneyCardUse.getVipId());
            moneyCardUseFlow.setTimes(-1);
            moneyCardUseFlow.setType(moneyCardPayDto.getType());
            moneyCardUseFlow.setCreateTime(new Date());
            moneyCardUseFlow.setOperationId(moneyCardPayDto.getUpdateUser());
            moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney());
            moneyCardUseFlowDao.insert(moneyCardUseFlow);
        });
    }
    private VerificationResult checkIsBangding(MoneyCardChangeDto moneyCardUse, List<Long> goodsIds) {
    /**
     * 检查商品是否在储值卡的消费范围内
     * @param moneyCardUseId 储值卡id
     * @param goodsIds  商品id集合
     * @return
     */
    private VerificationResult checkIsBangding(Long moneyCardUseId, List<Long> goodsIds) {
        // 如果是一卡通则肯定在绑定范围内
        MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardUseId);
        //默认储值卡可以购买所有产品
        if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)) {
            return true;
            return VerificationResult.success();
        } else {
            // 不是一卡通,
            // 判断卡是否可应用于所有产品
            // 不是默认储值卡判断卡是否可应用于所有产品
            ShoppingGoods cardGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId());
            if (cardGoods != null) {
                if (Dictionary.FLAG_YES.equals(cardGoods.getCarIsAll())) {
                    return true;
                if (Dictionary.FLAG_YES.equals(cardGoods.getGoodType())) {
                    return VerificationResult.success();
                }
            }
            // 比较分类
            MoneyCardAssemble moneyCardAssemble = new MoneyCardAssemble();
            moneyCardAssemble.setCardId(moneyCardUse.getGoodsId());
            List<MoneyCardAssemble> cardAssembleList = moneyCardAssembleDao.selectByModel(moneyCardAssemble);
            ShoppingGoods yhGoods = shoppingGoodsDao.selectById(goodsId);
            boolean flag = false;
            for (MoneyCardAssemble cardAssemble : cardAssembleList) {
                // 比较类型
                if (cardAssemble.getType().equals(Dictionary.CZK_ASSEMBLE_FL)) {
                    if (yhGoods.getCateId().equals(cardAssemble.getCateId())) {
                        flag = true;
                        break;
                    }
                } else {
                    // 比较绑定
                    if (yhGoods.getId().equals(cardAssemble.getGoodsId())) {
                        flag = true;
                        break;
            List<ShoppingGoods> yhGoods = shoppingGoodsDao.selectByIds(goodsIds);
            StringBuilder msgBuilder = new StringBuilder();
            for (ShoppingGoods goods : yhGoods) {
                boolean isMatch = false;
                for (MoneyCardAssemble cardAssemble : cardAssembleList) {
                    // 比较类型
                    if (cardAssemble.getType().equals(Dictionary.CZK_ASSEMBLE_FL)) {
                        if (goods.getCateId().equals(cardAssemble.getCateId())) {
                            isMatch = true;
                            break;
                        }
                    } else {
                        // 比较绑定
                        if (goods.getId().equals(cardAssemble.getGoodsId())) {
                            isMatch = true;
                            break;
                        }
                    }
                }
                if (!isMatch) {
                    msgBuilder.append(goods.getName() + "不在" + moneyCardUse.getCardName() + "优惠中 ");
                }
            }
            return flag;
            if (msgBuilder.length() > 0) {
                return VerificationResult.fail(msgBuilder.toString());
            } else {
                return VerificationResult.success();
            }
        }
    }
@@ -276,7 +396,6 @@
                    .append(",是否赠送:" + getObj.getSourceName());
        }
    }
    //设置为有效
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceHelper.java
@@ -7,14 +7,33 @@
 */
package com.matrix.system.hive.service.imp;
import com.matrix.system.hive.bean.ShoppingGoods;
import com.matrix.system.hive.bean.SysOrder;
import com.matrix.system.hive.bean.SysOrderFlow;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.matrix.core.constance.MatrixConstance;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.tools.LogUtil;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.BusParameterSettings;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.ShoppingGoodsDao;
import com.matrix.system.hive.dao.SysOrderFlowDao;
import com.matrix.system.hive.dto.MoneyCardOperationDto;
import com.matrix.system.hive.dto.MoneyCardPayDto;
import com.matrix.system.hive.dto.ProjUseOperationDto;
import com.matrix.system.hive.plugin.util.CollectionUtils;
import com.matrix.system.hive.service.CodeService;
import com.matrix.system.hive.service.MoneyCardUseService;
import com.matrix.system.hive.service.SysProjUseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @version: V1.0
@@ -29,6 +48,9 @@
    @Autowired
    private SysProjUseService sysProjUseService;
    @Autowired
    private CodeService codeService;
@@ -38,12 +60,21 @@
    @Autowired
    private SysOrderFlowDao sysOrderFlowDao;
    @Autowired
    BusParameterSettingsDao busParameterSettingsDao;
    @Autowired
    MoneyCardUseService moneyCardUseService;
    /**
     * 创建支付流水
     *
     * @author:姜友瑶
     */
    public void addOrderFlow(SysOrder sourceOrder) {
    public void addOrderFlow(SysOrder sourceOrder, boolean isBj) {
        LogUtil.info("创建支付流水 id={}", sourceOrder.getId());
        //处理支付流水
        int flowCount = 1;
        for (SysOrderFlow flow : sourceOrder.getFlows()) {
@@ -61,7 +92,12 @@
                flow.setAmount(flow.getAmount().negate());
                flow.setOrderId(sourceOrder.getOldOrderId());
            } else {
                flow.setFlowType(SysOrderFlow.FLOW_TYPE_BUY);
                if (isBj) {//jyytodo 优化不能根据isbj来判断流水类型
                    flow.setFlowType(SysOrderFlow.FLOW_TYPE_REPAY);
                } else {
                    flow.setFlowType(SysOrderFlow.FLOW_TYPE_BUY);
                }
                flow.setOrderId(sourceOrder.getId());
            }
            sysOrderFlowDao.insert(flow);
@@ -70,4 +106,133 @@
    }
    /**
     * 新增项目和套餐的余次
     *
     * @author:姜友瑶
     * @date 2016年9月2日
     */
    public void addTaocanProj(SysOrder order) {
        List<SysOrderItem> itemList = order.getItems();
        List<ProjUseOperationDto> projUseDtoList = Lists.newArrayList();
        for (SysOrderItem sysOrderItem : itemList) {
            // 折扣 项目的实际购买除以项目原价,来计算项目的消耗价格
            // 赠送 计算全额的消耗业绩
            ProjUseOperationDto projUseOperationDto = new ProjUseOperationDto();
            if (sysOrderItem.getIsFree().equals(Dictionary.FLAG_NO) && sysOrderItem.getZkPrice() > 0 && !isGiftMoneyPay(order)) {
                projUseOperationDto.setFree(false);
            } else {
                projUseOperationDto.setFree(true);
            }
            if (sysOrderItem.getType().equals(Dictionary.SHOPPING_GOODS_TYPE_TC)) {
                //计算折扣
                Double zk = sysOrderItem.getZkPrice() / sysOrderItem.getPrice();
                projUseOperationDto.setTcZk(zk);
            }
            projUseOperationDto.setPayMoney(sysOrderItem.getZkPrice());
            projUseOperationDto.setGoodsId(sysOrderItem.getGoodsId());
            projUseOperationDto.setCount(sysOrderItem.getCount());
            projUseOperationDto.setVipId(order.getVipId());
            projUseOperationDto.setOrderItemId(sysOrderItem.getId());
            projUseDtoList.add(projUseOperationDto);
        }
        sysProjUseService.addUserProjUse(projUseDtoList);
    }
    /**
     * 全是赠送金额,且配置了赠送金额购买计算为赠送
     *
     * @param order
     * @return
     */
    private boolean isGiftMoneyPay(SysOrder order) {
        BusParameterSettings giftiIsfree = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.SHOP_MANAGE_GIFTISFREE, order.getCompanyId());
        if (giftiIsfree.getParamValue().equals("是")) {
            return order.getFlows().stream().allMatch(item -> SysOrderFlow.IS_GIFT_Y.equals(item.getIsGift())
                    && item.getAmount().doubleValue() > 0D);
        } else {
            return false;
        }
    }
    /**
     * 使用充值卡付款操作
     *
     * @param pageOrder
     */
    public void cardPaySk(SysOrder pageOrder) {
        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
        List<SysOrderFlow> flows = pageOrder.getFlows();
        List<Long> goodsIds = pageOrder.getItems().stream().map(e -> e.getGoodsId()).collect(Collectors.toList());
        List<MoneyCardPayDto> moneyCardPayDtoList = Lists.newArrayList();
        flows.forEach(flow -> {
            if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) {
                if (flow.getCardId() != null) {
                    MoneyCardPayDto dto = new MoneyCardPayDto();
                    dto.setOrderNo(pageOrder.getOrderNo());
                    dto.setOrderId(pageOrder.getId());
                    dto.setCount(1);
                    dto.setCarUseId(flow.getCardId());
                    dto.setType(MoneyCardUseFlow.USE_TYPE_CONSUMER);
                    if (SysOrderFlow.IS_GIFT_Y.equals(flow.getIsGift())) {
                        dto.setGiftMoney(flow.getAmount().doubleValue());
                    } else {
                        dto.setRealMoney(flow.getAmount().doubleValue());
                    }
                    dto.setUpdateUser(user.getSuId());
                    dto.setGoodsIds(goodsIds);
                    moneyCardPayDtoList.add(dto);
                } else {
                    throw new GlobleException("无效的储值卡支付方式");
                }
            }
        });
        if (CollectionUtils.isNotEmpty(moneyCardPayDtoList)) {
            LogUtil.info("扣除储值卡余额{}", JSON.toJSONString(moneyCardPayDtoList));
            moneyCardUseService.changeMoneyCard(moneyCardPayDtoList);
        }
    }
    /**
     * @param sourceOrder 如果购买了充值卡设置会员的充值卡
     * @author:姜友瑶
     * @date 2016年9月19日
     */
    public void addMoneyCardUse(SysOrder sourceOrder) {
        List<MoneyCardOperationDto> moneyCardOperationDtos = Lists.newArrayList();
        List<SysOrderItem> orderItemList = sourceOrder.getItems();
        for (SysOrderItem sysOrderItem : orderItemList) {
            // 如果购买的是充值卡
            if (sysOrderItem.getType().equals(Dictionary.SHOPPING_GOODS_TYPE_CZK)) {
                for (int i = 0; i < sysOrderItem.getCount(); i++) {
                    MoneyCardOperationDto moneyCardOperationDto = new MoneyCardOperationDto();
                    moneyCardOperationDto.setVipId(sourceOrder.getVipId());
                    // 是否为赠送
                    if (sysOrderItem.getIsFree().equals(Dictionary.FLAG_YES)) {
                        moneyCardOperationDto.setSource(Dictionary.TAOCAN_SOURCE_ZS);
                    } else {
                        moneyCardOperationDto.setSource(Dictionary.TAOCAN_SOURCE_GM);
                    }
                    moneyCardOperationDto.setOrderItemId(sysOrderItem.getId());
                    moneyCardOperationDto.setGoodsId(sysOrderItem.getGoodsId());
                    moneyCardOperationDtos.add(moneyCardOperationDto);
                }
            }
        }
        if (CollUtil.isNotEmpty(moneyCardOperationDtos)) {
            moneyCardUseService.addVipMoneyCard(moneyCardOperationDtos);
        }
    }
}
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
@@ -64,6 +64,8 @@
    private SysOrderItemDao orderItemDao;
    @Autowired
    private SysProjUseDao sysProjUseDao;
    @Autowired
    private SysStoreInfoDao storeInfoDao;
    @Autowired
@@ -143,64 +145,16 @@
    @Autowired
    private SysOrderServiceHelper sysOrderServiceHelper;
    @Autowired
    private SysProjServicesService projServicesService;
    @Override
    public int add(SysOrder sysOrder) {
        return sysOrderDao.insert(sysOrder);
    }
    @Override
    public int modify(SysOrder sysOrder) {
        return sysOrderDao.update(sysOrder);
    }
    @Override
    public int remove(List<Long> list) {
        return sysOrderDao.deleteByIds(list);
    }
    @Override
    @Transactional
    public int removeById(Long id) {
        orderItemDao.deleteByOrderId(id);
        return sysOrderDao.deleteById(id);
    }
    @Override
    public List<SysOrder> findInPage(SysOrder sysOrder, PaginationVO pageVo) {
        if (pageVo != null) {
            pageVo.setSort("desc");
            pageVo.setSort("orderTime");
        }
        return sysOrderDao.selectInPage(sysOrder, pageVo);
    }
    @Autowired
    MoneyCardUseService moneyCardUseService;
    @Override
    public List<SysOrder> findByModel(SysOrder sysOrder) {
        return sysOrderDao.selectByModel(sysOrder);
    }
    @Override
    public int findTotal(SysOrder sysOrder) {
        return sysOrderDao.selectInPageCount(sysOrder);
    }
    @Override
    public SysOrder findById(Long id) {
        return sysOrderDao.selectById(id);
    }
    //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓业务代码区↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -317,7 +271,7 @@
            sysOrderDao.update(order);
            //保存单据日志
            operationLogService.saveOperation(order.getCompanyId(), order.getShopId(),sysUsers.getSuId(),
            operationLogService.saveOperation(order.getCompanyId(), order.getShopId(), sysUsers.getSuId(),
                    OperationFunctionEnum.ORDER,
                    OperationButtonEnum.CANCEL,
                    order.getId(),
@@ -422,7 +376,7 @@
            order.setStatu(Dictionary.ORDER_STATU_YQX);
            sysOrderDao.update(order);
            //保存单据日志
            operationLogService.saveOperation(order.getCompanyId(), order.getShopId(),sysUsers.getSuId(),
            operationLogService.saveOperation(order.getCompanyId(), order.getShopId(), sysUsers.getSuId(),
                    OperationFunctionEnum.ORDER,
                    OperationButtonEnum.CANCEL,
                    order.getId(),
@@ -430,7 +384,6 @@
                    order.getVipId(),
                    "已付款取消订单");
        }
    }
@@ -536,13 +489,16 @@
        sysVipInfoService.updateDealStatus(pageOrder.getVipId(), BooleanEnum.TRUE.getValue());
        //添加支付流水
        sysOrderServiceHelper.addOrderFlow(pageOrder);
        sysOrderServiceHelper.addOrderFlow(pageOrder,false);
        //扣除储值卡余额
        sysOrderServiceHelper.cardPaySk(pageOrder);
        // 设置会员充值卡使用情况
        addMoneyCardUse(pageOrder);
        sysOrderServiceHelper.addMoneyCardUse(pageOrder);
        // 改变客户项目套餐使用情况
        addTaocanProj(pageOrder);
        sysOrderServiceHelper.addTaocanProj(pageOrder);
        // 新增出库单
        addOutStore(pageOrder);
@@ -550,7 +506,6 @@
        // 设置业绩
        achieveNewService.addAchaeveByOrder(pageOrder);
        setShopSelCount(pageOrder);
        //设置会员积分
        addVipScore(pageOrder);
@@ -563,6 +518,7 @@
    /**
     * 保存订单收款日志
     *
     * @param pageOrder
     */
    private void saveOrderSkLog(SysOrder pageOrder) {
@@ -582,7 +538,7 @@
     * @param pageOrder
     */
    private void updateOrderInfo(SysOrder pageOrder) {
        LogUtil.info("付款更新订单信息 id={}",pageOrder.getId());
        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
        pageOrder.setCashierId(user.getSuId());
@@ -635,17 +591,17 @@
        GoodsSealLimitDto goodsSealLimitDto = new GoodsSealLimitDto();
        goodsSealLimitDto.setVipId(pageOrder.getVipId());
        goodsSealLimitDto.setSysOrderItemDtoList(Lists.newArrayList());
        pageOrder.getItems().forEach(e->{
        pageOrder.getItems().forEach(e -> {
            goodsSealLimitDto.getSysOrderItemDtoList().add(BeanUtil.copyProperties(e, SysOrderItemDto.class));
        });
        shoppingGoodsService.checkGoodsSealLimit(goodsSealLimitDto);
        //检查业绩设置
        checkOrderAchieve(pageOrder);
        LogUtil.info("订单满足支付条件 id={}",pageOrder.getId());
    }
    /**
@@ -680,11 +636,8 @@
    }
    /**
     * 设置会员消费积分
     *
     * @param pageOrder
     */
    private void addVipScore(SysOrder pageOrder) {
@@ -838,215 +791,10 @@
    /**
     * 验证商品是否达到最大发卡限制
     *
     * @author jiangyouyao
     */
    private void checkIsArrivedMax(ShoppingCarItem carItem) {
        // 获取该商品的最大购买数量
        ShoppingGoods shopGoods = shoppingGoodsDao.selectById(carItem.getGoodsId());
        Integer maxNum = shopGoods.getCarMaxSaleCount();
        // 最大发卡数量为0代表不做限制
        if (maxNum != null && maxNum != 0) {
            // 查询该商品已经被购买的次数
            Integer buyNum = orderItemDao.selectByGoodsId(shopGoods.getId(), null);
            buyNum = (buyNum == null ? 0 : buyNum);
            if ((buyNum + carItem.getCount()) > maxNum) {
                throw new GlobleException(shopGoods.getName() + "已超过最大销售数量");
            }
            if ((buyNum + carItem.getCount()) == maxNum) {
                if (!shopGoods.getStaus().equals(Dictionary.BUSINESS_STATE_DOWN)) {
                    shopGoods.setStaus(Dictionary.BUSINESS_STATE_DOWN);
                    shoppingGoodsDao.update(shopGoods);
                }
            }
        }
    }
    /**
     * 使用充值卡付款操作
     *
     * @param sourceOrder
     * @param moneyCardUse
     * @param flow
     */
    private void cardPaySk(MoneyCardUse moneyCardUse, SysOrder sourceOrder, SysOrderFlow flow) {
        // 判断商品是否在充值卡的限制购买,判断分类
        sourceOrder.getItems().forEach(item -> {
            if (!isInBangding(moneyCardUse, item.getGoodsId())) {
                throw new GlobleException(shoppingGoodsDao.selectById(item.getGoodsId()).getName() + "不在" + moneyCardUse.getCardName() + "优惠中");
            }
        });
        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
        MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow();
        if (SysOrderFlow.IS_GIFT_Y.equals(flow.getIsGift())) {
            if (moneyCardUse.getGiftMoney() >= flow.getAmount().doubleValue()) {
                double surplus = MoneyUtil.sub(moneyCardUse.getGiftMoney(), flow.getAmount().doubleValue());
                moneyCardUse.setGiftMoney(surplus);
                moneyCardUseFlow.setGiftMoney(0D - flow.getAmount().doubleValue());
            } else {
                throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
            }
        } else {
            if (moneyCardUse.getRealMoney() >= flow.getAmount().doubleValue()) {
                double surplus = MoneyUtil.sub(moneyCardUse.getRealMoney(), flow.getAmount().doubleValue());
                moneyCardUse.setRealMoney(surplus);
                moneyCardUseFlow.setTotal(0 - flow.getAmount().doubleValue());
            } else {
                throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
            }
        }
        if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_NO_N)) {
            //余额为0时充值卡变为无效
            if (moneyCardUse.getRealMoney().equals(0D) && moneyCardUse.getGiftMoney().equals(0D)) {
                moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y);
                moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX);
            }
        }
        ShoppingGoods shoppingGoods = shoppingGoodsService.findById(moneyCardUse.getGoodsId());
        if (shoppingGoods != null) {
            Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 2, moneyCardUse.getFailTime());
            moneyCardUse.setFailTime(invalidTime);
        }
        // 更新充值卡信息
        moneyCardUseDao.update(moneyCardUse);
        //设置卡项使用流水
        moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
        moneyCardUseFlow.setOrderNo(sourceOrder.getOrderNo());
        moneyCardUseFlow.setVipId(sourceOrder.getVipId());
        moneyCardUseFlow.setTimes(-1);
        moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_CONSUMER);
        moneyCardUseFlow.setCreateTime(new Date());
        moneyCardUseFlow.setOperationId(user.getSuId());
        moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney());
        moneyCardUseFlowDao.insert(moneyCardUseFlow);
    }
    /**
     * @param moneyCardUse
     * @param goodsId
     * @return 返回类型 boolean
     * 判断商品是否在充值卡的优惠中
     * @author:姜友瑶
     * @date 2016年9月19日
     */
    private boolean isInBangding(MoneyCardUse moneyCardUse, Long goodsId) {
        // 如果是一卡通则肯定在绑定范围内
        if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)) {
            return true;
        } else {
            // 不是一卡通,
            // 判断卡是否可应用于所有产品
            ShoppingGoods cardGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId());
            if (cardGoods != null) {
                if (Dictionary.FLAG_YES.equals(cardGoods.getCarIsAll())) {
                    return true;
                }
            }
            // 比较分类
            MoneyCardAssemble moneyCardAssemble = new MoneyCardAssemble();
            moneyCardAssemble.setCardId(moneyCardUse.getGoodsId());
            List<MoneyCardAssemble> cardAssembleList = moneyCardAssembleDao.selectByModel(moneyCardAssemble);
            ShoppingGoods yhGoods = shoppingGoodsDao.selectById(goodsId);
            boolean flag = false;
            for (MoneyCardAssemble cardAssemble : cardAssembleList) {
                // 比较类型
                if (cardAssemble.getType().equals(Dictionary.CZK_ASSEMBLE_FL)) {
                    if (yhGoods.getCateId().equals(cardAssemble.getCateId())) {
                        flag = true;
                        break;
                    }
                } else {
                    // 比较绑定
                    if (yhGoods.getId().equals(cardAssemble.getGoodsId())) {
                        flag = true;
                        break;
                    }
                }
            }
            return flag;
        }
    }
    /**
     * 设置销量
     *
     * @param sourceOrder
     */
    public void setShopSelCount(SysOrder sourceOrder) {
        for (SysOrderItem item : sourceOrder.getItems()) {
            // 正真实销量
            ShoppingGoods goods = shoppingGoodsDao.selectById(item.getGoodsId());
            if (goods.getRealSealCount() == null) {
                goods.setRealSealCount(item.getCount());
            } else {
                goods.setRealSealCount(goods.getRealSealCount() + item.getCount());
            }
            shoppingGoodsDao.update(goods);
        }
    }
    /**
     * @param sourceOrder 如果购买了充值卡设置会员的充值卡
     * @author:姜友瑶
     * @date 2016年9月19日
     */
    public void addMoneyCardUse(SysOrder sourceOrder) {
        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        List<SysOrderItem> orderItemList = sourceOrder.getItems();
        for (SysOrderItem sysOrderItem : orderItemList) {
            // 如果购买的是充值卡
            if (sysOrderItem.getType().equals(Dictionary.SHOPPING_GOODS_TYPE_CZK)) {
                for (int i = 0; i < sysOrderItem.getCount(); i++) {
                    ShoppingGoods moneyCar = shoppingGoodsDao.selectById(sysOrderItem.getGoodsId());
                    MoneyCardUse moneyCardUse = new MoneyCardUse();
                    moneyCardUse.setVipId(sourceOrder.getVipId());
                    moneyCardUse.setGiftMoney(moneyCar.getReferencePice());
                    moneyCardUse.setRealMoney(moneyCar.getSealPice());
                    moneyCardUse.setGoodsId(moneyCar.getId());
                    moneyCardUse.setOrderItemId(sysOrderItem.getId());
                    moneyCardUse.setSource(Dictionary.TAOCAN_SOURCE_GM);
                    moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
                    moneyCardUse.setCardName(moneyCar.getName());
                    moneyCardUse.setIsVipCar(Dictionary.FLAG_NO_N);
                    moneyCardUse.setVipId(sourceOrder.getVipId());
                    // 是否为赠送
                    if (sysOrderItem.getIsFree().equals(Dictionary.FLAG_YES)) {
                        moneyCardUse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
                    } else {
                        moneyCardUse.setSource(Dictionary.TAOCAN_SOURCE_GM);
                    }
                    //余次处理
                    if (moneyCar.getCarUseCount() == null || moneyCar.getCarUseCount() == 0) {
                        moneyCardUse.setUseTotal(999999999);
                        moneyCardUse.setLastCount(999999999);
                    } else {
                        moneyCardUse.setUseTotal(moneyCar.getCarUseCount());
                        moneyCardUse.setLastCount(moneyCar.getCarUseCount());
                    }
                    //失效时间处理
                    Date invalidTime = shoppingGoodsService.calInvalidTime(sysOrderItem.getShoppingGoods(), 1, null);
                    moneyCardUse.setFailTime(invalidTime);
                    moneyCardUseDao.insert(moneyCardUse);
                }
            }
        }
    }
    /**
     * 补交
     * @author:姜友瑶
     * @date 2016年9月19日
     */
@@ -1055,50 +803,32 @@
    public void updateAfterMoney(SysOrder pageOrder) {
        SysOrder sourceOrder = sysOrderDao.selectById(pageOrder.getId());
        int i = 1;
        //添加支付流水
        sysOrderServiceHelper.addOrderFlow(pageOrder,true);
        //扣除储值卡余额
        sysOrderServiceHelper.cardPaySk(pageOrder);
        double refundTotal = 0D;
        double cardPayTotal = 0D;
        double cashPayTotal = 0D;
        for (SysOrderFlow flow : pageOrder.getFlows()) {
            flow.setFlowNo(codeService.getFlowCode() + "-" + i);
            Long goodsId = pageOrder.getItems().get(0).getGoodsId();
            ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId);
            flow.setFlowContent(goods.getName() + "等" + pageOrder.getItems().size() + "件产品");
            flow.setOrderId(pageOrder.getId());
            flow.setVipId(pageOrder.getVipId());
            flow.setFlowType(SysOrderFlow.FLOW_TYPE_REPAY);
            // 若使用储值卡付款
            if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) {
                if (flow.getCardId() != null) {
                    cardPayTotal += flow.getAmount().doubleValue();
                    MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(flow.getCardId());
                    cardPaySk(moneyCardUse, pageOrder, flow);
                }
                cardPayTotal += flow.getAmount().doubleValue();
            } else {
                cashPayTotal += flow.getAmount().doubleValue();
            }
            refundTotal += flow.getAmount().doubleValue();
            flow.setShopId(sourceOrder.getShopId());
            flow.setCompanyId(sourceOrder.getCompanyId());
            sysOrderFlowDao.insert(flow);
            i++;
        }
        boolean haQk = false;
        if (refundTotal == pageOrder.getArrears()) {
            haQk = true;
        }
        //更新收款状态
        if (haQk) {
            sourceOrder.setStatu(Dictionary.ORDER_STATU_YFK);
        } else {
        }else{
            sourceOrder.setStatu(Dictionary.ORDER_STATU_QK);
        }
        sourceOrder.setArrears(sourceOrder.getArrears() - refundTotal);
        sourceOrder.setCardPay(sourceOrder.getCardPay() == null ? 0 : sourceOrder.getCardPay() + cardPayTotal);
        sourceOrder.setCashPay(sourceOrder.getCashPay() == null ? 0 : sourceOrder.getCashPay() + cashPayTotal);
@@ -1223,237 +953,11 @@
    }
    /**
     * 新增项目和套餐的余次
     *
     * @author:姜友瑶
     * @date 2016年9月2日
     */
    public void addTaocanProj(SysOrder order) {
        List<SysOrderItem> itemList = order.getItems();
        for (SysOrderItem sysOrderItem : itemList) {
            // 折扣 项目的实际购买除以项目原价,来计算项目的消耗价格
            // 赠送 计算全额的消耗业绩
            if (sysOrderItem.getType().equals(Dictionary.SHOPPING_GOODS_TYPE_XM)) {
                createXmProjuse(order, sysOrderItem);
            } else if (sysOrderItem.getType().equals(Dictionary.SHOPPING_GOODS_TYPE_TC)) {
                //每个套餐独立生成一个明细
                int orderCount = sysOrderItem.getCount();
                while (orderCount > 0) {
                    createTaocanProjUse(order, sysOrderItem, null);
                    orderCount--;
                }
            } else if (sysOrderItem.getType().equals(Dictionary.SHOPPING_GOODS_TYPE_ZHK)) {
                addZongheCarUse(order, sysOrderItem);
            }
        }
    }
    public void addZongheCarUse(SysOrder order, SysOrderItem sysOrderItem) {
        //处理一个订单买多次
        int orderCount = sysOrderItem.getCount();
        while (orderCount < 0) {
            orderCount--;
            //综合卡中包含的项目
            List<ShoppingGoodsAssemble> assembleList = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(sysOrderItem.getGoodsId(), ShoppingGoods.SHOPPING_GOODS_TYPE_XM);
            assembleList.forEach(item -> {
                //TODO 补综合卡逻辑
                createProjuseByAssemble(order, sysOrderItem, item, null, null, null, 0);
            });
            //处理综合卡中包含的套餐
            List<ShoppingGoodsAssemble> zhkAssemble = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(sysOrderItem.getGoodsId(), ShoppingGoods.SHOPPING_GOODS_TYPE_TC);
            zhkAssemble.forEach(taocan -> {
                int assembleCount = taocan.getTotal();
                while (assembleCount > 0) {
                    assembleCount--;
                    createTaocanProjUse(order, sysOrderItem, taocan);
                }
            });
        }
    }
    /**
     * 通过组合关系创建用户项目余次
     */
    private SysProjUse createProjuseByAssemble(SysOrder order, SysOrderItem sysOrderItem,
                                               ShoppingGoodsAssemble goodsAssemble, Long taocanId, Date failTime, String source, Integer maxCount) {
        //计算折扣
        Double zk = sysOrderItem.getZkPrice() / sysOrderItem.getPrice();
        SysProjUse puse = new SysProjUse();
        puse.setIsOver(Dictionary.DELETED_N);
        puse.setOrderItemId(sysOrderItem.getId());
        puse.setProjId(goodsAssemble.getAssembleGoodId());
        puse.setSurplusCount(goodsAssemble.getTotal() == null ? maxCount : goodsAssemble.getTotal());
        puse.setDeductionNum(goodsAssemble.getDeductionNum());
        puse.setProjName(goodsAssemble.getShoppingGoods().getName());
        puse.setVipId(order.getVipId());
        puse.setStatus(Dictionary.TAOCAN_STATUS_YX);
        puse.setTaocanId(taocanId);
        puse.setType(Dictionary.SHOPPING_GOODS_TYPE_XM);
        puse.setSource(source);
        if (taocanId == null) {
            puse.setPrice(goodsAssemble.getShoppingGoods().getPrice() * zk);
        } else {
            puse.setPrice(goodsAssemble.getPrice() * zk);
        }
        //赠送项目是否计算消耗业绩否则 赠送产品按原价计算消耗
        boolean zsConsumeAchieve = projServicesService.skipServiceOrderStep(Dictionary.ZS_CONSUME_ACHIEVE);
        if (zsConsumeAchieve) {
            if (sysOrderItem.getPrice() <= 0) {
                //等于0取原价
                if (taocanId == null) {
                    puse.setPrice(goodsAssemble.getShoppingGoods().getPrice());
                } else {
                    puse.setPrice(goodsAssemble.getPrice());
                }
            }
        } else {
            puse.setPrice(0D);
        }
        puse.setBalance(MoneyUtil.mul(puse.getPrice(), Double.valueOf(puse.getSurplusCount())));
        puse.setFailTime(failTime);
        sysProjUseDao.insert(puse);
        return puse;
    }
    private void createTaocanProjUse(SysOrder order, SysOrderItem sysOrderItem, ShoppingGoodsAssemble goodsAssemble) {
        //新建套餐
        SysProjUse taocanProjUse = new SysProjUse();
        ShoppingGoods taocanShoppingGoods = sysOrderItem.getShoppingGoods();
        Long projId = sysOrderItem.getGoodsId();
        if (goodsAssemble != null) {
            taocanShoppingGoods = shoppingGoodsDao.selectById(goodsAssemble.getAssembleGoodId());
            projId = goodsAssemble.getAssembleGoodId();
        }
        taocanProjUse.setProjId(projId);
        taocanProjUse.setIsOver(Dictionary.DELETED_N);
        taocanProjUse.setOrderItemId(sysOrderItem.getId());
        taocanProjUse.setProjName(taocanShoppingGoods.getName());
        taocanProjUse.setVipId(order.getVipId());
        taocanProjUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
        taocanProjUse.setType(Dictionary.SHOPPING_GOODS_TYPE_TC);
        taocanProjUse.setIsCourse(taocanShoppingGoods.getIsCourse());
        taocanProjUse.setIsInfinite(taocanShoppingGoods.getIsInfinite());
        // 赠送和打折后金额为0的都视为赠送项目
        if (sysOrderItem.getIsFree().equals(Dictionary.FLAG_NO) && sysOrderItem.getZkPrice() > 0 && !isGiftMoneyPay(order)) {
            taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_GM);
        } else {
            taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
        }
        // 失效时间
        Date invalidTime = shoppingGoodsService.calInvalidTime(taocanShoppingGoods, 1, null);
        taocanProjUse.setFailTime(invalidTime);
        sysProjUseDao.insert(taocanProjUse);
        //计划次数
        int surplusCount = 0;
        //总余额
        Double sumBanance = 0D;
        //创建套餐绑定的项目
        List<ShoppingGoodsAssemble> assembleList = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(projId, ShoppingGoods.SHOPPING_GOODS_TYPE_XM);
        for (ShoppingGoodsAssemble assemble : assembleList) {
            SysProjUse tempUse = createProjuseByAssemble(order, sysOrderItem, assemble, taocanProjUse.getId(), taocanProjUse.getFailTime(), taocanProjUse.getSource(), taocanShoppingGoods.getCarUseCount());
            sumBanance += tempUse.getBalance();
            surplusCount += tempUse.getSurplusCount();
        }
        if (Dictionary.FLAG_NO_N.equals(taocanShoppingGoods.getIsCourse())) {
            //固定套餐,剩余次数等于绑定项目的次数
            taocanProjUse.setSurplusCount(surplusCount);
            //合计套餐余额
            taocanProjUse.setBalance(sumBanance);
        } else {
            //任选套餐剩余次数等于最大使用次数
            taocanProjUse.setSurplusCount(taocanShoppingGoods.getCarUseCount());
            taocanProjUse.setBalance(sysOrderItem.getZkPrice());
        }
        sysProjUseDao.update(taocanProjUse);
    }
    @Autowired
    private SysProjServicesService projServicesService;
    /**
     * 根据订单创建用户项目使用情况
     *
     * @param order
     * @param sysOrderItem
     */
    private void createXmProjuse(SysOrder order, SysOrderItem sysOrderItem) {
        SysProjUse puse = new SysProjUse();
        puse.setIsOver(Dictionary.DELETED_N);
        puse.setOrderItemId(sysOrderItem.getId());
        puse.setProjId(sysOrderItem.getGoodsId());
        puse.setSurplusCount(sysOrderItem.getCount());
        puse.setVipId(order.getVipId());
        puse.setStatus(Dictionary.TAOCAN_STATUS_YX);
        puse.setType(Dictionary.SHOPPING_GOODS_TYPE_XM);
        puse.setProjName(sysOrderItem.getShoppingGoods().getName());
        // 赠送和打折后金额为0的都视为赠送项目
        if (sysOrderItem.getIsFree().equals(Dictionary.FLAG_NO) && sysOrderItem.getZkPrice() > 0 && !isGiftMoneyPay(order)) {
            puse.setSource(Dictionary.TAOCAN_SOURCE_GM);
            puse.setPrice(sysOrderItem.getZkPrice());
        } else {
            puse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
            //赠送项目是否计算消耗业绩否则 赠送产品按原价计算消耗
            boolean zsConsumeAchieve = projServicesService.skipServiceOrderStep(Dictionary.ZS_CONSUME_ACHIEVE);
            if (zsConsumeAchieve) {
                //赠送情况下,如果收款金额大于0,就是赠送金额划扣的情况,金额即为划扣的折扣金额
                if (sysOrderItem.getZkPrice() > 0) {
                    puse.setPrice(sysOrderItem.getZkPrice());
                } else {
                    puse.setPrice(sysOrderItem.getShoppingGoods().getSealPice());
                }
            } else {
                puse.setPrice(0D);
            }
        }
        // 设置失效时间
        Date invalidTime = shoppingGoodsService.calInvalidTime(sysOrderItem.getShoppingGoods(), 1, null);
        puse.setFailTime(invalidTime);
        puse.setBalance(puse.getPrice() * puse.getSurplusCount());
        sysProjUseDao.insert(puse);
    }
    /**
     * 全是赠送金额,且配置了赠送金额购买计算为赠送
     *
     * @param order
     * @return
     */
    private boolean isGiftMoneyPay(SysOrder order) {
        BusParameterSettings giftiIsfree = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.SHOP_MANAGE_GIFTISFREE, order.getCompanyId());
        if (giftiIsfree.getParamValue().equals("是")) {
            return order.getFlows().stream().allMatch(item -> SysOrderFlow.IS_GIFT_Y.equals(item.getIsGift())
                    && item.getAmount().doubleValue() > 0D);
        } else {
            return false;
        }
    }
    /**
@@ -1544,7 +1048,7 @@
        order.setFlows(czVo.getFlows());
        sysOrderServiceHelper.addOrderFlow(order);
        sysOrderServiceHelper.addOrderFlow(order,false);
        // 添加员工业绩
        achieveNewService.addAchaeveByOrder(order);
@@ -1638,7 +1142,7 @@
        // 添加订单收款流水
        sysOrderServiceHelper.addOrderFlow(sysOrder);
        sysOrderServiceHelper.addOrderFlow(sysOrder,false);
        //退款退套餐退项目
        refundProjUse(sysOrder);
        //删除积分
@@ -1657,38 +1161,6 @@
    }
    private void addRefundOrderFlow(SysOrder sourceOrder) {
        //处理支付流水
        int flowCount = 1;
        for (SysOrderFlow flow : sourceOrder.getFlows()) {
            //支付内容摘要设置
            Long goodsId = sourceOrder.getItems().get(0).getGoodsId();
            ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId);
            flow.setFlowContent(goods.getName() + "等" + sourceOrder.getItems().size() + "件产品");
            // 退款,则取负数
            flow.setFlowType(SysOrderFlow.FLOW_TYPE_REFUND);
            flow.setAmount(flow.getAmount().negate());
            flow.setOrderId(sourceOrder.getOldOrderId());
            //统计储值卡支付
            if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) {
                if (flow.getCardId() != null) {
                    MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(flow.getCardId());
                    //修改储值卡余额
                    cardPaySk(moneyCardUse, sourceOrder, flow);
                } else {
                    throw new GlobleException("无效的储值卡支付方式");
                }
            }
            flow.setFlowNo(codeService.getFlowCode() + "-" + flowCount);
            flow.setVipId(sourceOrder.getVipId());
            flow.setShopId(sourceOrder.getShopId());
            flow.setCompanyId(sourceOrder.getCompanyId());
            sysOrderFlowDao.insert(flow);
            flowCount++;
        }
    }
    private void refundCard(MoneyCardUse moneyCardUse, SysOrder sourceOrder, SysOrderFlow flow) {
        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
@@ -1886,4 +1358,63 @@
    public BigDecimal findVipArrearsByVipId(Long vipId) {
        return sysOrderDao.selectArrearsByVipId(vipId);
    }
    //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓===增删改查代码区↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    @Override
    public int add(SysOrder sysOrder) {
        return sysOrderDao.insert(sysOrder);
    }
    @Override
    public int modify(SysOrder sysOrder) {
        return sysOrderDao.update(sysOrder);
    }
    @Override
    public int remove(List<Long> list) {
        return sysOrderDao.deleteByIds(list);
    }
    @Override
    @Transactional
    public int removeById(Long id) {
        orderItemDao.deleteByOrderId(id);
        return sysOrderDao.deleteById(id);
    }
    @Override
    public List<SysOrder> findInPage(SysOrder sysOrder, PaginationVO pageVo) {
        if (pageVo != null) {
            pageVo.setSort("desc");
            pageVo.setSort("orderTime");
        }
        return sysOrderDao.selectInPage(sysOrder, pageVo);
    }
    @Override
    public List<SysOrder> findByModel(SysOrder sysOrder) {
        return sysOrderDao.selectByModel(sysOrder);
    }
    @Override
    public int findTotal(SysOrder sysOrder) {
        return sysOrderDao.selectInPageCount(sysOrder);
    }
    @Override
    public SysOrder findById(Long id) {
        return sysOrderDao.selectById(id);
    }
}
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOutStoreServiceImpl.java
@@ -143,8 +143,14 @@
    }
    @Override
    public int checkInfo(SysOutStore sysOutStore) {
    public int effectOutStore(SysOutStore sysOutStore) {
        SysOutStore queryStore = sysOutStoreDao.selectById(sysOutStore.getId());
        if(!queryStore.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH)){
            throw new GlobleException("单据状态已更新,请刷新");
        }
        List<SysOutStoreItem> list = queryStore.getOutStoreItems();
        int flag = 0;
        for (SysOutStoreItem item : list) {
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
@@ -1,5 +1,6 @@
package com.matrix.system.hive.service.imp;
import cn.hutool.core.collection.CollUtil;
import com.matrix.core.constance.MatrixConstance;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.pojo.AjaxResult;
@@ -7,11 +8,18 @@
import com.matrix.core.tools.DateUtil;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.common.validate.ParameterValidate;
import com.matrix.system.common.validate.group.Group;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.*;
import com.matrix.system.hive.dto.ProjUseOperationDto;
import com.matrix.system.hive.plugin.util.MoneyUtil;
import com.matrix.system.hive.service.ShoppingGoodsService;
import com.matrix.system.hive.service.SysProjServicesService;
import com.matrix.system.hive.service.SysProjUseService;
import com.matrix.system.hive.validation.ProjUseGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -19,6 +27,9 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * @date 2016-07-03 20:53
@@ -28,7 +39,8 @@
    @Autowired
    private SysProjUseDao sysProjUseDao;
    @Autowired
    SysProjServicesService projServicesService;
    @Autowired
    private SysProjuseFreezeDao sysProjuseFreezeDao;
@@ -49,6 +61,11 @@
    @Autowired
    SysVipInfoDao sysVipInfoDao;
    @Autowired
    ShoppingGoodsService shoppingGoodsService;
    @Autowired
    BusParameterSettingsDao busParameterSettingsDao;
    @Override
    public int add(SysProjUse sysProjUse) {
@@ -60,7 +77,6 @@
    @Override
    public int modify(SysProjUse sysProjUse) {
        //插入套餐项目操作记录
        return sysProjUseDao.update(sysProjUse);
@@ -221,7 +237,7 @@
                freeze.setVipId(taocan.getVipId());
                SysProjuseFreeze freezeProj = sysProjuseFreezeDao.selectByOrderItemId(freeze);
                // todo  因为目前没有在冻结的时候插入冻结记录,所以这里暂时这样处理
                if(freezeProj!=null){
                if (freezeProj != null) {
                    Date dateAfter = DateUtil.nextNDate(taocan.getFailTime(), freezeProj.getGapDays());
                    taocan.setFailTime(dateAfter);
                }
@@ -232,7 +248,7 @@
        taocan.setStatus(Dictionary.TAOCAN_STATUS_YX);
        sysProjUseDao.updateProjStatus(taocan);
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(taocan.getProjName());
        useFlow.setProjUseId(taocan.getId());
        useFlow.setOptionType("人工修改");
@@ -273,7 +289,7 @@
            }
            SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
            SysProjUseFlow useFlow=new SysProjUseFlow();
            SysProjUseFlow useFlow = new SysProjUseFlow();
            useFlow.setProjName(taocan.getProjName());
            useFlow.setProjUseId(taocan.getId());
            useFlow.setOptionType("人工修改");
@@ -364,7 +380,7 @@
        int i = sysProjUseDao.updateTcStatus(sysProjUse.getId(), "无效");
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(taocan.getProjName());
        useFlow.setProjUseId(taocan.getId());
        useFlow.setOptionType("人工修改");
@@ -378,8 +394,6 @@
        return i;
    }
    /*********************以下为项目使用情况操作***********************/
@@ -468,7 +482,7 @@
        SysProjuseFreeze freeze = new SysProjuseFreeze();
        freeze.setFreezeTime(new Date());
        freeze.setVipId(sysProjUse.getVipId());
        freeze.setOrderItemId(sysProjUse.getId()+"");
        freeze.setOrderItemId(sysProjUse.getId() + "");
        SysProjuseFreeze getfreeze = sysProjuseFreezeDao.selectByOrderItemId(freeze);
        int i = 0;
        if (getfreeze != null) {
@@ -478,7 +492,7 @@
            i = sysProjuseFreezeDao.insert(freeze);
        }
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(sysProjUse.getProjName());
        useFlow.setProjUseId(sysProjUse.getId());
        useFlow.setOptionType("人工修改");
@@ -515,7 +529,7 @@
        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX);
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(sysProjUse.getProjName());
        useFlow.setProjUseId(sysProjUse.getId());
        useFlow.setOptionType("人工修改");
@@ -528,8 +542,6 @@
        sysProjUseDao.insertFlow(useFlow);
        return sysProjUseDao.update(sysProjUse);
    }
    /**
@@ -574,7 +586,7 @@
        sysProjUseDao.update(proj);
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        SysProjUseFlow useFlow=new SysProjUseFlow();
        SysProjUseFlow useFlow = new SysProjUseFlow();
        useFlow.setProjName(proj.getProjName());
        useFlow.setProjUseId(proj.getId());
        useFlow.setOptionType("人工修改");
@@ -590,6 +602,151 @@
    }
    /**
     * 添加用户套餐
     *
     * @param projUseDtoList
     * @return
     */
    @Override
    public void addUserProjUse(List<ProjUseOperationDto> projUseDtoList) {
        if(CollUtil.isEmpty(projUseDtoList)){
            throw new GlobleException("projUseDtoList 不能为空");
        }
        List<ShoppingGoods> shoppingGoodsList = shoppingGoodsDao.selectByIds(projUseDtoList.stream().map(ProjUseOperationDto::getGoodsId).collect(Collectors.toList()));
        Map<Long, ShoppingGoods> shoppingGoodsMap = shoppingGoodsList.stream().collect(Collectors.toMap(ShoppingGoods::getId, Function.identity()));
        for (ProjUseOperationDto projUseOperationDto : projUseDtoList) {
            ShoppingGoods shoppingGoods = shoppingGoodsMap.get(projUseOperationDto.getGoodsId());
            if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(shoppingGoods.getGoodType())) {
                createProjectUse(projUseOperationDto, shoppingGoods);
            } else if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(shoppingGoods.getGoodType())) {
                //每个套餐独立生成一个明细
                int orderCount = projUseOperationDto.getCount();
                while (orderCount > 0) {
                    createTaocanProjUse(projUseOperationDto, shoppingGoods);
                    orderCount--;
                }
            }
        }
    }
    private void createTaocanProjUse(ProjUseOperationDto projUseOperationDto, ShoppingGoods shoppingGoods) {
        ParameterValidate.ValidResult baseIdResult = ParameterValidate.validateBean(projUseOperationDto, ProjUseGroup.addTc.class);
        if (baseIdResult.hasErrors()) {
            throw new GlobleException(baseIdResult.getErrors());
        }
        //新建套餐
        SysProjUse taocanProjUse = new SysProjUse();
        ShoppingGoods taocanShoppingGoods = shoppingGoods;
        Long projId = shoppingGoods.getId();
        taocanProjUse.setProjId(projId);
        taocanProjUse.setIsOver(Dictionary.DELETED_N);
        taocanProjUse.setOrderItemId(projUseOperationDto.getOrderItemId());
        taocanProjUse.setProjName(taocanShoppingGoods.getName());
        taocanProjUse.setVipId(projUseOperationDto.getVipId());
        taocanProjUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
        taocanProjUse.setType(Dictionary.SHOPPING_GOODS_TYPE_TC);
        taocanProjUse.setIsCourse(taocanShoppingGoods.getIsCourse());
        taocanProjUse.setIsInfinite(taocanShoppingGoods.getIsInfinite());
        // 赠送和打折后金额为0的都视为赠送项目
        if (projUseOperationDto.isFree()) {
            taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
        } else {
            taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_GM);
        }
        // 失效时间
        Date invalidTime = shoppingGoodsService.calInvalidTime(taocanShoppingGoods, 1, null);
        taocanProjUse.setFailTime(invalidTime);
        sysProjUseDao.insert(taocanProjUse);
        //计划次数
        int surplusCount = 0;
        //总余额
        Double sumBanance = 0D;
        //创建套餐绑定的项目
        List<ShoppingGoodsAssemble> assembleList = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(projId, ShoppingGoods.SHOPPING_GOODS_TYPE_XM);
        for (ShoppingGoodsAssemble assemble : assembleList) {
            ProjUseOperationDto projUseDto = new ProjUseOperationDto();
            projUseDto.setCount(assemble.getTotal());
            projUseDto.setGoodsId(assemble.getShoppingGoodsId());
            projUseDto.setFree(projUseOperationDto.isFree());
            projUseDto.setPayMoney(MoneyUtil.mul(assemble.getPrice(), projUseOperationDto.getTcZk()));
            projUseDto.setOrderItemId(projUseOperationDto.getOrderItemId());
            projUseDto.setVipId(projUseOperationDto.getVipId());
            projUseDto.setTcId(taocanProjUse.getId());
            SysProjUse tempUse = createProjectUse(projUseDto, assemble.getShoppingGoods());
            sumBanance += tempUse.getBalance();
            surplusCount += tempUse.getSurplusCount();
        }
        if (Dictionary.FLAG_NO_N.equals(taocanShoppingGoods.getIsCourse())) {
            //固定套餐,剩余次数等于绑定项目的次数
            taocanProjUse.setSurplusCount(surplusCount);
            //合计套餐余额
            taocanProjUse.setBalance(sumBanance);
        } else {
            //任选套餐剩余次数等于最大使用次数
            taocanProjUse.setSurplusCount(taocanShoppingGoods.getCarUseCount());
            taocanProjUse.setBalance(projUseOperationDto.getPayMoney());
        }
        sysProjUseDao.update(taocanProjUse);
    }
    private SysProjUse createProjectUse(ProjUseOperationDto projUseOperationDto, ShoppingGoods shoppingGoods) {
        ParameterValidate.ValidResult baseIdResult = ParameterValidate.validateBean(projUseOperationDto, ProjUseGroup.addProject.class);
        if (baseIdResult.hasErrors()) {
            throw new GlobleException(baseIdResult.getErrors());
        }
        SysProjUse puse = new SysProjUse();
        puse.setIsOver(Dictionary.DELETED_N);
        puse.setOrderItemId(projUseOperationDto.getOrderItemId());
        puse.setProjId(projUseOperationDto.getGoodsId());
        puse.setSurplusCount(projUseOperationDto.getCount());
        puse.setVipId(projUseOperationDto.getVipId());
        puse.setStatus(Dictionary.TAOCAN_STATUS_YX);
        puse.setType(Dictionary.SHOPPING_GOODS_TYPE_XM);
        puse.setProjName(shoppingGoods.getName());
        puse.setTaocanId(projUseOperationDto.getTcId());
        // 赠送和打折后金额为0的都视为赠送项目
        if (!projUseOperationDto.isFree()) {
            puse.setSource(Dictionary.TAOCAN_SOURCE_GM);
            puse.setPrice(projUseOperationDto.getPayMoney());
        } else {
            puse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
            //赠送项目是否计算消耗业绩否则 赠送产品按原价计算消耗
            boolean zsConsumeAchieve = projServicesService.skipServiceOrderStep(Dictionary.ZS_CONSUME_ACHIEVE);
            if (zsConsumeAchieve) {
                //赠送情况下,如果收款金额大于0,就是赠送金额划扣的情况,金额即为划扣的折扣金额
                if (projUseOperationDto.getPayMoney() > 0) {
                    puse.setPrice(projUseOperationDto.getPayMoney());
                } else {
                    puse.setPrice(shoppingGoods.getSealPice());
                }
            } else {
                puse.setPrice(0D);
            }
        }
        // 设置失效时间
        Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 1, null);
        puse.setFailTime(invalidTime);
        puse.setBalance(puse.getPrice() * puse.getSurplusCount());
        sysProjUseDao.insert(puse);
        return puse;
    }
    @Override
    public int updateProjUseTck(SysProjUse projUse) {
zq-erp/src/main/java/com/matrix/system/hive/validation/ProjUseGroup.java
New file
@@ -0,0 +1,19 @@
package com.matrix.system.hive.validation;
public interface ProjUseGroup {
    /**
     * 新增会员项目
     */
    interface addProject {
    }
    /**
     * 新增会员套餐
     */
    interface addTc {
    }
}
zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java
@@ -15,6 +15,7 @@
import com.matrix.system.hive.service.ShoppingGoodsService;
import com.matrix.system.hive.service.SysOrderService;
import com.matrix.system.hive.service.SysVipInfoService;
import com.matrix.system.hive.service.imp.SysOrderServiceHelper;
import com.matrix.system.shopXcx.bean.ShopOrder;
import com.matrix.system.shopXcx.bean.ShopOrderDetails;
import com.matrix.system.shopXcx.bean.ShopSku;
@@ -87,6 +88,10 @@
    @Autowired
    private ShopSalesmanGradeDao shopSalesmanGradeDao;
    @Autowired
    private SysOrderServiceHelper sysOrderServiceHelper;
    @Transactional(rollbackFor = Exception.class)
    public void synchronizationOrderToErp(ShopOrder orderDto) {
@@ -201,10 +206,10 @@
            SysOrder sourceOrder = sysOrderDao.selectById(order.getId());
            sourceOrder.setItems(orderItemDao.selectByOrderId(order.getId()));
            // 设置会员充值卡使用情况
            orderService.addMoneyCardUse(sourceOrder);
            sysOrderServiceHelper.addMoneyCardUse(sourceOrder);
            // 改变客户项目套餐使用情况
            orderService.addTaocanProj(sourceOrder);
            sysOrderServiceHelper.addTaocanProj(sourceOrder);
            // 设置销量
            orderService.setShopSelCount(sourceOrder);
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html
@@ -257,6 +257,10 @@
                                        prop="failTime"
                                        label="到期时间">
                                </el-table-column>
                                <el-table-column
                                        prop="createTime"
                                        label="创建时间">
                                </el-table-column>
                                <el-table-column label="操作">
                                    <template slot-scope="scope">
                                        <el-button matrix:btn="vipinfoClub-youxiao" v-if="scope.row.status!='有效'" type="text" size="small" @click="tabProjValid(scope.$index, scope.row)">有效</el-button>
@@ -300,6 +304,11 @@
                                <el-table-column
                                        prop="failTime"
                                        label="到期时间">
                                </el-table-column>
                                <el-table-column
                                        prop="createTime"
                                        label="创建时间">
                                </el-table-column>
                                <el-table-column label="操作" fixed="right" width="160">
                                    <template slot-scope="scope">
@@ -356,6 +365,10 @@
                                        label="到期时间" width="160">
                                </el-table-column>
                                <el-table-column
                                        prop="createTime"
                                        label="创建时间">
                                </el-table-column>
                                <el-table-column
                                        prop="remark"
                                        label="备注">
                                </el-table-column>