From 76ed413ae6fd573996207760904304b4951df5d5 Mon Sep 17 00:00:00 2001
From: 935090232@qq.com <ak473600000>
Date: Sun, 13 Mar 2022 18:43:34 +0800
Subject: [PATCH] 重构:套餐项目

---
 zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java            |   18 
 zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java                |    3 
 zq-erp/src/main/java/com/matrix/system/common/validate/beans/ErrorMessage.java          |   44 +
 zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java                     |    2 
 zq-erp/src/main/java/com/matrix/system/hive/validation/ProjUseGroup.java                |   19 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html               |   13 
 zq-erp/src/main/java/com/matrix/system/common/validate/HDValidateResult.java            |  213 ++++++
 zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidate.java           |  136 ++++
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java    |  185 ++++
 zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidateFailNoFast.java |  134 +++
 zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java                   |    2 
 zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java              |    9 
 zq-erp/src/main/java/com/matrix/system/hive/dto/ProjUseOperationDto.java                |   71 ++
 zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardPayDto.java                    |    6 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java        |  655 ++----------------
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOutStoreServiceImpl.java     |    8 
 zq-erp/src/main/java/com/matrix/system/hive/action/OutStoreController.java              |    2 
 zq-erp/src/main/java/com/matrix/system/common/validate/group/Group.java                 |   44 +
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceHelper.java      |  175 +++++
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java      |  185 +++++
 zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java                    |    9 
 zq-erp/src/main/java/com/matrix/core/pojo/VerificationResult.java                       |   18 
 zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardOperationDto.java              |   62 +
 zq-erp/src/main/java/com/matrix/system/hive/service/SysOutStoreService.java             |    7 
 24 files changed, 1,386 insertions(+), 634 deletions(-)

diff --git a/zq-erp/src/main/java/com/matrix/core/pojo/VerificationResult.java b/zq-erp/src/main/java/com/matrix/core/pojo/VerificationResult.java
index 3c93147..6bce512 100644
--- a/zq-erp/src/main/java/com/matrix/core/pojo/VerificationResult.java
+++ b/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;
diff --git a/zq-erp/src/main/java/com/matrix/system/common/validate/HDValidateResult.java b/zq-erp/src/main/java/com/matrix/system/common/validate/HDValidateResult.java
new file mode 100644
index 0000000..503fb7a
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/common/validate/HDValidateResult.java
@@ -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;
+    }
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidate.java b/zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidate.java
new file mode 100644
index 0000000..cbeb8cd
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidate.java
@@ -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));
+        }
+    }
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidateFailNoFast.java b/zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidateFailNoFast.java
new file mode 100644
index 0000000..d98fd61
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidateFailNoFast.java
@@ -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));
+        }
+    }
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/common/validate/beans/ErrorMessage.java b/zq-erp/src/main/java/com/matrix/system/common/validate/beans/ErrorMessage.java
new file mode 100644
index 0000000..63003e2
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/common/validate/beans/ErrorMessage.java
@@ -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;
+    }
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/common/validate/group/Group.java b/zq-erp/src/main/java/com/matrix/system/common/validate/group/Group.java
new file mode 100644
index 0000000..e3e3daf
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/common/validate/group/Group.java
@@ -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{}
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/OutStoreController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/OutStoreController.java
index 5a642fe..2b0dea4 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/OutStoreController.java
+++ b/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,  "审核成功!");
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java
index 7eae13c..f379302 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java
@@ -243,7 +243,7 @@
     private Integer carMaxSaleCount;
 
     /**
-     * 是一卡通吗
+     * 充值卡使用范围 是否所有产品
      */
     private String carIsAll;
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java
index cc06823..4116c43 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java
+++ b/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();
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardOperationDto.java b/zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardOperationDto.java
new file mode 100644
index 0000000..9b5b356
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardOperationDto.java
@@ -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;
+
+
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardChangeDto.java b/zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardPayDto.java
similarity index 90%
rename from zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardChangeDto.java
rename to zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardPayDto.java
index b99ae5a..7df89df 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardChangeDto.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardPayDto.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;
     /**
      * 操作人
      */
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dto/ProjUseOperationDto.java b/zq-erp/src/main/java/com/matrix/system/hive/dto/ProjUseOperationDto.java
new file mode 100644
index 0000000..7c7ddec
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dto/ProjUseOperationDto.java
@@ -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;
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java
index c367c08..c083f38 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java
+++ b/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);
 
     /**
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java
index 5f21562..9046886 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java
+++ b/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);
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysOutStoreService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysOutStoreService.java
index dd538f2..8b89de0 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/SysOutStoreService.java
+++ b/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);
 
    	
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java
index ed21be0..fa92426 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java
+++ b/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);
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
index 2b6ba2e..a1b5de0 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
+++ b/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());
         }
     }
-
 
 
     //设置为有效
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceHelper.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceHelper.java
index 3eb4294..6aad069 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceHelper.java
+++ b/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);
+        }
+
+    }
+
+
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
index ce7fac0..ed9cb4b 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
+++ b/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);
+
+    }
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOutStoreServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOutStoreServiceImpl.java
index 961d01e..eeada1b 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOutStoreServiceImpl.java
+++ b/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) {
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
index b30f76c..a464c3d 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
+++ b/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) {
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/validation/ProjUseGroup.java b/zq-erp/src/main/java/com/matrix/system/hive/validation/ProjUseGroup.java
new file mode 100644
index 0000000..0026bc0
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/validation/ProjUseGroup.java
@@ -0,0 +1,19 @@
+package com.matrix.system.hive.validation;
+
+public interface ProjUseGroup {
+
+    /**
+     * 新增会员项目
+     */
+    interface addProject {
+    }
+
+    /**
+     * 新增会员套餐
+     */
+    interface addTc {
+    }
+
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java
index c885d81..3690062 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java
+++ b/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);
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html
index cd96811..ace7138 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html
+++ b/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>

--
Gitblit v1.9.1