zq-erp/src/main/java/com/matrix/core/exception/GlobleExceptionResolver.java
@@ -53,7 +53,7 @@ if (ex instanceof GlobleException) { // 如果是内部全局异常 LogUtil.warn("#程序抛出全局异常#", ex); LogUtil.error("#程序抛出全局异常#", ex); GlobleException globleException = (GlobleException) ex; attr.put("status", globleException.getErrorCode()); attr.put("info", globleException.getMessage()); @@ -61,7 +61,7 @@ } else { // 非内部异常 LogUtil.error("#程序抛出未捕获异常#", ex); LogUtil.error("#程序抛出未捕获异常#"); attr.put("status", 999999); attr.put("info", InternationaUtil.getMesssge(SystemErrorCode.SYSTEM_UNKNOW_ERROR)); // 发送异常信息到管理群 zq-erp/src/main/java/com/matrix/core/pojo/VerificationResult.java
@@ -8,16 +8,38 @@ @Data public class VerificationResult { /** * 审核结果 */ private boolean judgeResult; private String msg; private Object info; private VerificationResult(){ } public static VerificationResult success(){ return buildVerificationResult(true); } public static VerificationResult success(String msg){ return buildVerificationResult(true,msg); } public static VerificationResult fail(){ return buildVerificationResult(false); } public static VerificationResult fail(String msg){ return buildVerificationResult(false,msg); } public static VerificationResult buildVerificationResult(boolean judgeResult){ VerificationResult obj=new VerificationResult(); obj.judgeResult =judgeResult; zq-erp/src/main/java/com/matrix/core/tools/ParamCheckUtil.java
@@ -1,8 +1,5 @@ package com.matrix.core.tools; import com.matrix.system.hive.dto.OrderItemDto; import java.util.ArrayList; import java.util.List; import java.util.function.Function; zq-erp/src/main/java/com/matrix/system/app/action/ApiOrderAction.java
@@ -17,10 +17,10 @@ import com.matrix.system.hive.action.util.QueryUtil; import com.matrix.system.hive.bean.ShoppingGoodsCategory; import com.matrix.system.hive.bean.SysOrder; import com.matrix.system.hive.bean.SysOrderItem; import com.matrix.system.hive.bean.SysShopInfo; import com.matrix.system.hive.dao.SysShopInfoDao; import com.matrix.system.hive.plugin.util.CollectionUtils; import com.matrix.system.hive.pojo.ShoppingCarItem; import com.matrix.system.hive.pojo.ShoppingCarItemsVo; import com.matrix.system.hive.service.ShoppingGoodsCategoryService; import com.matrix.system.hive.service.ShoppingGoodsService; @@ -109,31 +109,26 @@ @ApiOperation(value = "创建订单", notes = "创建订单") @PostMapping(value = "/createOrder") public AjaxResult createOrder(@RequestBody @Validated CreateOrderDto createOrderDto) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysOrder order=new SysOrder(); order.setVipId(createOrderDto.getVipId()); ShoppingCarItemsVo car = new ShoppingCarItemsVo(); car.setVipId(createOrderDto.getVipId()); if (CollectionUtils.isNotEmpty(createOrderDto.getItems())) { List<ShoppingCarItem> list = new ArrayList<>(); List<SysOrderItem> list = new ArrayList<>(); for (CreateOderItemDto item : createOrderDto.getItems()) { ShoppingCarItem carItem = new ShoppingCarItem(); carItem.setCount(item.getCount()); carItem.setGoodsId(item.getGoodsId()); carItem.setIsFree(item.getIsFree()); carItem.setType(item.getGoodsType()); carItem.setShoppingGoods(shoppingGoodsService.findById(item.getGoodsId())); list.add(carItem); SysOrderItem orderItem = new SysOrderItem(); orderItem.setCount(item.getCount()); orderItem.setGoodsId(item.getGoodsId()); orderItem.setIsFree(item.getIsFree()); //jyytodo 这个字段可以不传 orderItem.setType(item.getGoodsType()); list.add(orderItem); } car.setCarItems(list); order.setItems(list); } int i = sysOrderService.createOrder(WebUtil.getSession(), car); if (i > 0) { return AjaxResult.buildSuccessInstance("下单成功"); } return AjaxResult.buildFailInstance("下单失败"); sysOrderService.checkAndSaveOrder(order); return AjaxResult.buildSuccessInstance("下单成功"); } @ApiOperation(value = "获取订单列表", notes = "获取订单列表") zq-erp/src/main/java/com/matrix/system/common/tools/ServiceUtil.java
@@ -87,6 +87,8 @@ public boolean updateCheckRepeatTowColumn(String tableName, String column1, Object value1, String column2, Object value2, String idName, Object idValue) { HashMap<String, Object> query = excuteTow(tableName, column1, value1, column2, value2); return query != null && !query.get(idName).equals(idValue); } zq-erp/src/main/java/com/matrix/system/common/validate/GroupValidateStatusCheckUtil.java
New file @@ -0,0 +1,30 @@ /** * projectName: h3-warehouse * fileName: GroupValidateStatusCheckUtil.java * packageName: com.hydee.h3.warehouse.util * date: 2020-05-22 10:48 * copyright(c) 2020 http://www.hydee.cn/ Inc. All rights reserved. */ package com.matrix.system.common.validate; import com.alibaba.fastjson.JSON; import com.matrix.core.exception.GlobleException; import com.matrix.core.tools.LogUtil; import org.slf4j.Logger; /** * 参数校验工具 **/ public class GroupValidateStatusCheckUtil { public static void check(Object o, Class group) { LogUtil.info("操作:{},参数:{}", "参数校验", JSON.toJSONString(o)); ParameterValidate.ValidResult acceptanceResult = ParameterValidate.validateBean(o, group); if (acceptanceResult.hasErrors()) { throw new GlobleException(acceptanceResult.getErrors()); } } } zq-erp/src/main/java/com/matrix/system/common/validate/HDValidateResult.java
New file @@ -0,0 +1,213 @@ /** * projectName: h3-organization * fileName: HDValidateResult.java * packageName: com.hydee.common.validate * date: 2019-06-17 14:46 * copyright(c) 2019 http://www.hydee.cn/ Inc. All rights reserved. */ package com.matrix.system.common.validate; import org.springframework.beans.PropertyEditorRegistry; import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; import java.beans.PropertyEditor; import java.util.List; import java.util.Map; /** * @version: V1.0 * @author: LiHengye * @className: HDValidateResult * @packageName: com.hydee.common.validate * @description: 校验结果 * @data: 2019-06-17 14:46 **/ public class HDValidateResult implements BindingResult { @Override public Object getTarget() { return null; } @Override public Map<String, Object> getModel() { return null; } @Override public Object getRawFieldValue(String s) { return null; } @Override public PropertyEditor findEditor(String s, Class<?> aClass) { return null; } @Override public PropertyEditorRegistry getPropertyEditorRegistry() { return null; } @Override public String[] resolveMessageCodes(String s) { return new String[0]; } @Override public String[] resolveMessageCodes(String s, String s1) { return new String[0]; } @Override public void addError(ObjectError objectError) { } @Override public String getObjectName() { return null; } @Override public void setNestedPath(String s) { } @Override public String getNestedPath() { return null; } @Override public void pushNestedPath(String s) { } @Override public void popNestedPath() throws IllegalStateException { } @Override public void reject(String s) { } @Override public void reject(String s, String s1) { } @Override public void reject(String s, Object[] objects, String s1) { } @Override public void rejectValue(String s, String s1) { } @Override public void rejectValue(String s, String s1, String s2) { } @Override public void rejectValue(String s, String s1, Object[] objects, String s2) { } @Override public void addAllErrors(Errors errors) { } @Override public boolean hasErrors() { return false; } @Override public int getErrorCount() { return 0; } @Override public List<ObjectError> getAllErrors() { return null; } @Override public boolean hasGlobalErrors() { return false; } @Override public int getGlobalErrorCount() { return 0; } @Override public List<ObjectError> getGlobalErrors() { return null; } @Override public ObjectError getGlobalError() { return null; } @Override public boolean hasFieldErrors() { return false; } @Override public int getFieldErrorCount() { return 0; } @Override public List<FieldError> getFieldErrors() { return null; } @Override public FieldError getFieldError() { return null; } @Override public boolean hasFieldErrors(String s) { return false; } @Override public int getFieldErrorCount(String s) { return 0; } @Override public List<FieldError> getFieldErrors(String s) { return null; } @Override public FieldError getFieldError(String s) { return null; } @Override public Object getFieldValue(String s) { return null; } @Override public Class<?> getFieldType(String s) { return null; } } zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidate.java
New file @@ -0,0 +1,136 @@ /** * projectName: h3-organization * fileName: ParameterValidate.java * packageName: com.hydee.common.validate * date: 2019-06-17 10:48 * copyright(c) 2019 http://www.hydee.cn/ Inc. All rights reserved. */ package com.matrix.system.common.validate; import com.matrix.system.common.validate.beans.ErrorMessage; import com.matrix.system.common.validate.group.Group; import org.hibernate.validator.HibernateValidator; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * @version: V1.0 * @author: LiHengye * @className: ParameterValidate * @packageName: com.hydee.common.validate * @description: 参数验证 * @data: 2019-06-17 10:48 **/ public class ParameterValidate { /** * 开启快速结束模式 failFast (true) */ private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator(); /** * 校验对象 * @param t bean * @param groups 校验组 * @return ValidResult */ public static <T> ValidResult validateBean(T t,Class<?>...groups) { ValidResult result = new ValidResult(); Set<ConstraintViolation<T>> violationSet = validator.validate(t,groups); boolean hasError = violationSet != null && violationSet.size() > 0; result.setHasErrors(hasError); if (hasError) { for (ConstraintViolation<T> violation : violationSet) { result.addError(violation.getPropertyPath().toString(), violation.getMessageTemplate()); } } return result; } /** * 校验bean的某一个属性 * @param obj bean * @param propertyName 属性名称 * @return ValidResult */ public static <T> ValidResult validateProperty(T obj, String propertyName) { ValidResult result = new ValidResult(); Set<ConstraintViolation<T>> violationSet = validator.validateProperty(obj, propertyName, Group.ADD.class); boolean hasError = violationSet != null && violationSet.size() > 0; result.setHasErrors(hasError); if (hasError) { for (ConstraintViolation<T> violation : violationSet) { result.addError(propertyName, violation.getMessage()); } } return result; } /** * 校验结果类 */ public static class ValidResult { /** * 是否有错误 */ private boolean hasErrors; /** * 错误信息 */ private List<ErrorMessage> errors; public ValidResult() { this.errors = new ArrayList<>(); } public boolean hasErrors() { return hasErrors; } public void setHasErrors(boolean hasErrors) { this.hasErrors = hasErrors; } /** * 获取所有验证信息 * @return 集合形式 */ public List<ErrorMessage> getAllErrors() { return errors; } /** * 获取所有验证信息 * @return 字符串形式 */ public String getErrors(){ StringBuilder sb = new StringBuilder(); for (ErrorMessage error : errors) { sb.append(error.getPropertyPath()).append(":不能为空"); // sb.append(error.getPropertyPath()).append(":").append(error.getMessage()).append(" "); } return sb.toString(); } public String getAllErrorMessage(){ StringBuilder sb = new StringBuilder(); for (ErrorMessage error : errors) { if(error.getMessage() == null || error.getMessage().isEmpty()){ sb.append(error.getPropertyPath()).append(":不合法!"); }else{ sb.append(error.getPropertyPath()).append(":").append(error.getMessage()).append(" "); } } return sb.toString(); } public void addError(String propertyPath, String message) { this.errors.add(new ErrorMessage(propertyPath, message)); } } } zq-erp/src/main/java/com/matrix/system/common/validate/ParameterValidateFailNoFast.java
New file @@ -0,0 +1,134 @@ /** * projectName: common * fileName: ParameterValidateFailNoFast.java * packageName: com.hydee.common.validate * date: 2021-04-22 9:25 上午 * copyright(c) 2021 http://www.hydee.cn/ Inc. All rights reserved. */ package com.matrix.system.common.validate; import com.matrix.system.common.validate.beans.ErrorMessage; import com.matrix.system.common.validate.group.Group; import org.hibernate.validator.HibernateValidator; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * @version: V1.0 * @author: LiHengye * @className: ParameterValidateFailNoFast * @packageName: com.hydee.common.validate * @description: 参数校验遇到错误非立刻返回 * @data: 2021-04-22 9:25 上午 **/ public class ParameterValidateFailNoFast { /** * 开启快速结束模式 failFast (true) */ private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator(); /** * 校验对象 * @param t bean * @param groups 校验组 * @return ValidResult */ public static <T> ValidResult validateBean(T t, Class<?>...groups) { ValidResult result = new ValidResult(); Set<ConstraintViolation<T>> violationSet = validator.validate(t,groups); boolean hasError = violationSet != null && violationSet.size() > 0; result.setHasErrors(hasError); if (hasError) { for (ConstraintViolation<T> violation : violationSet) { result.addError(violation.getPropertyPath().toString(), violation.getMessageTemplate()); } } return result; } /** * 校验bean的某一个属性 * @param obj bean * @param propertyName 属性名称 * @return ValidResult */ public static <T> ValidResult validateProperty(T obj, String propertyName) { ValidResult result = new ValidResult(); Set<ConstraintViolation<T>> violationSet = validator.validateProperty(obj, propertyName, Group.ADD.class); boolean hasError = violationSet != null && violationSet.size() > 0; result.setHasErrors(hasError); if (hasError) { for (ConstraintViolation<T> violation : violationSet) { result.addError(propertyName, violation.getMessage()); } } return result; } /** * 校验结果类 */ public static class ValidResult { /** * 是否有错误 */ private boolean hasErrors; /** * 错误信息 */ private List<ErrorMessage> errors; public ValidResult() { this.errors = new ArrayList<>(); } public boolean hasErrors() { return hasErrors; } public void setHasErrors(boolean hasErrors) { this.hasErrors = hasErrors; } /** * 获取所有验证信息 * @return 集合形式 */ public List<ErrorMessage> getAllErrors() { return errors; } /** * 获取所有验证信息 * @return 字符串形式 */ public String getErrors(){ StringBuilder sb = new StringBuilder(); for (ErrorMessage error : errors) { sb.append(error.getPropertyPath()).append(":").append(error.getMessage()).append(" /"); } return sb.toString(); } public String getAllErrorMessage(){ StringBuilder sb = new StringBuilder(); for (ErrorMessage error : errors) { if(error.getMessage() == null || error.getMessage().isEmpty()){ sb.append(error.getPropertyPath()).append(":不合法!"); }else{ sb.append(error.getPropertyPath()).append(":").append(error.getMessage()).append(" "); } } return sb.toString(); } public void addError(String propertyPath, String message) { this.errors.add(new ErrorMessage(propertyPath, message)); } } } zq-erp/src/main/java/com/matrix/system/common/validate/beans/ErrorMessage.java
New file @@ -0,0 +1,44 @@ /** * projectName: h3-organization * fileName: ErrorMessage.java * packageName: com.hydee.common.validate.beans * date: 2019-06-17 10:42 * copyright(c) 2019 http://www.hydee.cn/ Inc. All rights reserved. */ package com.matrix.system.common.validate.beans; /** * @version: V1.0 * @author: LiHengye * @className: ErrorMessage * @packageName: com.hydee.common.validate.beans * @description: 错误信息 * @data: 2019-06-17 10:42 **/ public class ErrorMessage { private String propertyPath; private String message; public ErrorMessage(String propertyPath, String message) { this.propertyPath = propertyPath; this.message = message; } public String getPropertyPath() { return propertyPath; } public void setPropertyPath(String propertyPath) { this.propertyPath = propertyPath; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } zq-erp/src/main/java/com/matrix/system/common/validate/group/Group.java
New file @@ -0,0 +1,44 @@ /** * projectName: h3-organization * fileName: Group.java * packageName: group * date: 2019-06-17 10:43 * copyright(c) 2019 http://www.hydee.cn/ Inc. All rights reserved. */ package com.matrix.system.common.validate.group; /** * @version: V1.0 * @author: LiHengye * @className: Group * @packageName: group * @description: 验证信息组 * @data: 2019-06-17 10:43 **/ public interface Group { /** * 默认分组 */ static interface Default{} /** * 新增分组 */ static interface ADD{} /** * 修改分组 */ static interface MODIFY{} /** * 删除分组 */ static interface DELETE{} /** * 查询分组 */ static interface SELECT{} } zq-erp/src/main/java/com/matrix/system/constance/Dictionary.java
@@ -403,10 +403,6 @@ * 商城商品-充值卡 */ String SHOPPING_GOODS_TYPE_CZK = "充值卡"; /** * 商城商品-综合卡 */ String SHOPPING_GOODS_TYPE_ZHK = "综合卡"; zq-erp/src/main/java/com/matrix/system/enums/BooleanEnum.java
New file @@ -0,0 +1,63 @@ package com.matrix.system.enums; import com.google.common.collect.Lists; import com.matrix.core.enums.EnumApiShowAble; import com.matrix.core.enums.EnumsShowVo; import com.matrix.core.exception.GlobleException; import java.util.List; import java.util.stream.Collectors; /** * 是否枚举 * @author jyy */ public enum BooleanEnum implements EnumApiShowAble { TRUE(1, "是"), FALSE(2, "否"), DEFAULT(3, ""), ; private Integer value; private String displayName; BooleanEnum(Integer value, String displayName) { this.value = value; this.displayName = displayName; } public static String getByValue(Integer value) { for (int i = 0; i < values().length; i++) { if (value.equals(values()[i].getValue())) { return values()[i].displayName; } } throw new GlobleException("无效枚举值"); } @Override public String getEnumCode() { return "booleanEnum"; } @Override public List<EnumsShowVo> getEnumsShowVos() { return Lists.newArrayList(values()).stream().map(item -> EnumsShowVo.builder() .displayName(item.getDisplayName()) .value(item.value) .build() ).collect(Collectors.toList()); } public Integer getValue() { return value; } public String getDisplayName() { return displayName; } } zq-erp/src/main/java/com/matrix/system/hive/action/MoneyCardUseController.java
@@ -2,7 +2,6 @@ import com.matrix.component.asyncmessage.AsyncMessageManager; import com.matrix.core.constance.MatrixConstance; import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.AjaxResult; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.WebUtil; @@ -87,7 +86,7 @@ @RequestMapping(value = "/cz") public @ResponseBody AjaxResult cz(@RequestBody CzXkVo czVo) { SysOrder order= orderService.updateAddCardMoney(czVo); SysOrder order= orderService.moneyCardCz(czVo); AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, "充值成功"); //发送微信公众号提醒 zq-erp/src/main/java/com/matrix/system/hive/action/OrderController.java
@@ -23,6 +23,7 @@ import com.matrix.system.constance.Dictionary; import com.matrix.system.enums.OperationButtonEnum; import com.matrix.system.enums.OperationFunctionEnum; import com.matrix.system.hive.action.util.QueryUtil; import com.matrix.system.hive.bean.*; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.plugin.util.CollectionUtils; @@ -149,7 +150,7 @@ sysOrder.setIsHasRefund(SysOrder.IS_HAS_REFUND_N); //校验订单是否满足结算调价,新订单则保存订单,已有订单则删除后更新 sysOrder = orderService.checkAndSaveOrder(sysOrder); orderService.updateReceiptMoney(sysOrder); orderService.payOrder(sysOrder); //发送微信公众号提醒 UniformMsgParam uniformMsgParam = new UniformMsgParam(user.getCompanyId(), UniformMsgParam.GZH_GMCG); @@ -180,7 +181,7 @@ } } } orderService.refundOrderMoney(sysOrder); orderService.orderTk(sysOrder); //处理用户购买的产品 return AjaxResult.buildSuccessInstance(Arrays.asList(sysOrder), "订单退款成功"); } @@ -218,6 +219,7 @@ if (!DataAuthUtil.hasAllShopAuth()) { sysOrder.setShopId(getMe().getShopId()); } QueryUtil.setQueryLimitCom(sysOrder); return new AjaxResult(AjaxResult.STATUS_SUCCESS, orderService.findInPage(sysOrder, pageVo), orderService.findTotal(sysOrder)); } @@ -259,7 +261,7 @@ @RequestMapping(value = "/sk") public @ResponseBody AjaxResult sk(SysOrder order) throws GlobleException { orderService.updateReceiptMoney(order); orderService.payOrder(order); return new AjaxResult(AjaxResult.STATUS_SUCCESS, "收款成功"); } @@ -478,13 +480,7 @@ return new AjaxResult(AjaxResult.STATUS_FAIL, "订单不存在!"); } List<SysOrderItem> items = orderItemDao.selectByOrderId(id); for (SysOrderItem item : items) { List<SysProjServices> sysProjServices = sysProjServicesDao.selectProjServicesByOrderItemId(item.getId()); if (CollUtil.isNotEmpty(sysProjServices)) { return new AjaxResult(AjaxResult.STATUS_FAIL, "订单存在进行中的服务单无法取消/删除"); } } orderService.cancelOrder(id); zq-erp/src/main/java/com/matrix/system/hive/action/OutStoreController.java
@@ -133,7 +133,7 @@ int i=0; if (sysOutStore.getId() != null) { i=currentService.checkInfo(sysOutStore); i=currentService.effectOutStore(sysOutStore); } if(i>0){ return new AjaxResult(AjaxResult.STATUS_SUCCESS, "审核成功!"); zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsController.java
@@ -129,7 +129,6 @@ shoppingGoods.setAssembleProj(shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(shoppingGoods.getId(), ShoppingGoods.SHOPPING_GOODS_TYPE_XM)); } else if ( Dictionary.SHOPPING_GOODS_TYPE_XM.equals(shoppingGoods.getGoodType()) || Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(shoppingGoods.getGoodType()) ) { shoppingGoods.setAssembleGoods(shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(shoppingGoods.getId(), null)); } else if (Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(shoppingGoods.getGoodType())) { @@ -190,7 +189,6 @@ } } shoppingGoods.setIsDel(ShoppingGoods.NORMAL); shoppingGoods.setStaus(Dictionary.BUSINESS_STATE_UP); List<ShoppingGoods> dataList = shoppingGoodsService.findInPage(shoppingGoods, pageVo); AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, dataList, shoppingGoodsService.findTotal(shoppingGoods)); return result; @@ -316,9 +314,6 @@ shoppingGoods.setAssembleGoods(assembleListGoods); List<ShoppingGoodsAssemble> assembleListProj = shoppingGoodsAssembleDao.selectProjByShoppingGoodsId(shoppingGoods.getId()); shoppingGoods.setAssembleProj(assembleListProj); } else if (Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(shoppingGoods.getGoodType())) { List<ShoppingGoodsAssemble> assembleList = shoppingGoodsAssembleDao.selectAssembleShoppingGoodsByShoppingGoodsId(shoppingGoods.getId()); shoppingGoods.setZongheCarGoods(assembleList); } @@ -347,9 +342,6 @@ // 返回充值卡编辑界面 WebUtil.getRequest().setAttribute("obj", shoppingGoods); return "admin/hive/products/money-card-form"; } else if (shoppingGoods.getGoodType().equals(Dictionary.SHOPPING_GOODS_TYPE_ZHK)) { WebUtil.getRequest().setAttribute("obj", shoppingGoods); return "admin/hive/products/zonghe-card-form"; } zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java
@@ -88,6 +88,7 @@ /** * // jyytodo 可以考虑一个已启用未启用的状态,开卡后如果没有使用过就视为未启用 * 状态,有效,无效,转让,冻结,退款 */ private String status; zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUseFlow.java
@@ -10,10 +10,15 @@ */ public class MoneyCardUseFlow implements Serializable{ //jyytodo 改成枚举 public static final String USE_TYPE_CONSUMER = "消费扣款"; public static final String USE_TYPE_ORDRE_CANCEL = "取消订单"; public static final String USE_TYPE_ORDRE_TK = "订单退款"; public static final String USE_TYPE_GM = "购买充值卡"; public static final String USE_TYPE_CZ = "会员充值"; public static final String USE_TYPE_CARD_MODIFY = "会员卡调整"; zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java
@@ -243,7 +243,7 @@ private Integer carMaxSaleCount; /** * 是一卡通吗 * 充值卡使用范围 是否所有产品 */ private String carIsAll; zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrder.java
@@ -26,6 +26,8 @@ */ public static final int ORDER_TYPE_REFUND= 2; /** * 序号 */ zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java
@@ -90,7 +90,7 @@ int selectShopppingGoodsAipTotal(@Param("record") ShoppingGoodsListDto shoppingGoodsListDto); public List<ShoppingGoods> selectByIds(@Param("ids")List<Integer> ids); public List<ShoppingGoods> selectByIds(@Param("ids")List<Long> ids); int updateInvalidProduct(); } zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderItemDao.java
@@ -66,4 +66,6 @@ List<ErpOrderDetailItemVo> selectErpOrderItemByOrderId(String orderId); List<SysOrderItem> selectDgd(); String selectOrderStatusByItemId(Long orderItemId); } zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjUseDao.java
@@ -136,4 +136,8 @@ List<SysProjUse> selectTaoCanListWithProj(@Param("record") SysProjUse sysProjUse); int selectTaocanCountForCourseAndInfinite(@Param("taocanId") Long taocanId, @Param("vipId") Long vipId); int selectUseCountByOrderItemId(Long orderItemId); List<SysProjUse> selectByOrderItemId(Long orderItemId); } zq-erp/src/main/java/com/matrix/system/hive/dto/GoodsSealLimitDto.java
@@ -20,6 +20,6 @@ /** * 销售明细 */ private List<OrderItemDto> orderItemDtoList; private List<SysOrderItemDto> sysOrderItemDtoList; } zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardOperationDto.java
New file @@ -0,0 +1,139 @@ /** * 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 com.matrix.system.hive.validation.MoneyCardUseGroup; import lombok.Data; import javax.validation.constraints.NotNull; import java.util.List; /** * @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 */ @NotNull(groups = {MoneyCardUseGroup.moneyCardUseOrderChange.class, MoneyCardUseGroup.moneyCardUseCz.class,}) private Long carUseId; /** * 会员id */ @NotNull(groups = { Group.ADD.class }) private Long vipId; /** * 来源,购买,转让,赠送 */ @NotNull(groups = { Group.ADD.class}) private String source; /** * 订单明细id */ @NotNull(groups = {MoneyCardUseGroup.moneyCardUseTk.class, Group.ADD.class }) private Long orderItemId; /** * 操作类型 */ @NotNull(groups = {MoneyCardUseGroup.moneyCardUseTk.class, MoneyCardUseGroup.moneyCardUseOrderChange.class, MoneyCardUseGroup.moneyCardUseCz.class, Group.ADD.class }) private String type; /** * 操作人 */ @NotNull(groups = {MoneyCardUseGroup.moneyCardUseTk.class, MoneyCardUseGroup.moneyCardUseOrderChange.class, MoneyCardUseGroup.moneyCardUseCz.class, Group.ADD.class }) private Long updateUser; /** * 订单id */ @NotNull(groups = {MoneyCardUseGroup.moneyCardUseTk.class, MoneyCardUseGroup.moneyCardUseOrderChange.class, MoneyCardUseGroup.moneyCardUseCz.class, Group.ADD.class }) private Long orderId; /** * 订单编号 */ @NotNull(groups = {MoneyCardUseGroup.moneyCardUseTk.class, MoneyCardUseGroup.moneyCardUseOrderChange.class, MoneyCardUseGroup.moneyCardUseCz.class, Group.ADD.class }) private String orderNo; /** * 充值卡的商品 */ @NotNull(groups = { Group.ADD.class}) private Long goodsId; /** * 赠送金额扣减 */ @NotNull(groups = { MoneyCardUseGroup.moneyCardUseCz.class, MoneyCardUseGroup.moneyCardUseOrderChange.class }) private Double giftMoney; /** * 本金扣减 */ @NotNull(groups = {MoneyCardUseGroup.moneyCardUseTk.class, MoneyCardUseGroup.moneyCardUseCz.class, MoneyCardUseGroup.moneyCardUseOrderChange.class }) private Double realMoney; /** * 次数 */ @NotNull(groups = {MoneyCardUseGroup.moneyCardUseOrderChange.class}) private Integer count; /** * 备注 */ private String remark; /** * 支付的商品id */ @NotNull(groups = {MoneyCardUseGroup.moneyCardUseOrderChange.class}) private List<Long> goodsIds; } zq-erp/src/main/java/com/matrix/system/hive/dto/ProjUseOperationDto.java
New file @@ -0,0 +1,97 @@ package com.matrix.system.hive.dto; import com.matrix.system.hive.hievEnum.OrderOperationEnum; import com.matrix.system.hive.validation.ProjUseGroup; 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, ProjUseGroup.projectTk.class, ProjUseGroup.taocanTk.class }) private Long goodsId; /** * 添加次数 */ @NotNull(groups = {ProjUseGroup.addProject.class, ProjUseGroup.addTc.class, ProjUseGroup.projectTk.class, ProjUseGroup.taocanTk.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, ProjUseGroup.projectTk.class, ProjUseGroup.taocanTk.class}) private Long orderItemId; /** * 是否为赠送 */ @NotNull(groups = {ProjUseGroup.addProject.class, ProjUseGroup.addTc.class}) private boolean isFree; /** * 操作类型 */ private OrderOperationEnum orderOperationType; /** * 套餐折扣 * 设置折扣后,套餐下绑定的项目消耗金额会对应打折 * -- 套餐类型必传 */ @NotNull(groups = {ProjUseGroup.addTc.class}) private Double tcZk; /** * 所属套餐id * -- 添加套餐下的项目必传 */ private Long tcId; /** * 操作人id */ @NotNull(groups = {ProjUseGroup.addProject.class, ProjUseGroup.addTc.class}) private Long updateUserId; } zq-erp/src/main/java/com/matrix/system/hive/dto/SysOrderItemDto.java
File was renamed from zq-erp/src/main/java/com/matrix/system/hive/dto/OrderItemDto.java @@ -1,16 +1,15 @@ package com.matrix.system.hive.dto; import lombok.Builder; import lombok.Data; import lombok.ToString; /** * 订单明细DTO * @author jyy */ @Data @ToString @Builder public class OrderItemDto { @Data public class SysOrderItemDto { /** * 商城 商品id */ zq-erp/src/main/java/com/matrix/system/hive/hievEnum/OrderOperationEnum.java
New file @@ -0,0 +1,65 @@ package com.matrix.system.hive.hievEnum; import com.google.common.collect.Lists; import com.matrix.core.enums.EnumApiShowAble; import com.matrix.core.enums.EnumsShowVo; import com.matrix.core.exception.GlobleException; import java.util.List; import java.util.stream.Collectors; /** * 订单操作枚举 * @author jyy */ public enum OrderOperationEnum implements EnumApiShowAble { SAVE(1, "订单保存"), PAY(2, "订单付款"), RETURN(3, "订单退款"), CANCEL(4, "订单取消"), BJ(5, "订单补交"), ; private Integer value; private String displayName; OrderOperationEnum(Integer value, String displayName) { this.value = value; this.displayName = displayName; } public static String getByValue(Integer value) { for (int i = 0; i < values().length; i++) { if (value.equals(values()[i].getValue())) { return values()[i].displayName; } } throw new GlobleException("无效枚举值"); } @Override public String getEnumCode() { return "booleanEnum"; } @Override public List<EnumsShowVo> getEnumsShowVos() { return Lists.newArrayList(values()).stream().map(item -> EnumsShowVo.builder() .displayName(item.getDisplayName()) .value(item.value) .build() ).collect(Collectors.toList()); } public Integer getValue() { return value; } public String getDisplayName() { return displayName; } } zq-erp/src/main/java/com/matrix/system/hive/hievEnum/PayMethodEnum.java
File was deleted zq-erp/src/main/java/com/matrix/system/hive/service/AchieveNewService.java
@@ -121,4 +121,5 @@ List<DailyBeautyListVo> findDailyBeautyList(AchieveNew achieveNew, PaginationVO pageVo); int findDailyBeautyListTotal(AchieveNew achieveNew); void removeByOrderId(Long id); } zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java
@@ -1,20 +1,35 @@ package com.matrix.system.hive.service; import java.util.List; import com.matrix.core.pojo.PaginationVO; import com.matrix.system.hive.bean.MoneyCardUse; import com.matrix.system.hive.dto.MoneyCardOperationDto; import com.matrix.system.hive.plugin.util.BaseServices; import java.util.List; /** * @date 2016-09-17 10:17 */ public interface MoneyCardUseService extends BaseServices<MoneyCardUse> { /** * 新增MoneyCardUse * 扣除储值卡余额 */ void changeMoneyCard(List<MoneyCardOperationDto> moneyCardOperationDtos); /** * 新增用户储值卡 * @param moneyCardOperationDtos */ public void addVipMoneyCard(List<MoneyCardOperationDto> moneyCardOperationDtos) ; /** * 新增MoneyCardUse */ public int add(MoneyCardUse moneyCardUse); /** @@ -113,4 +128,17 @@ public List<MoneyCardUse> findVipCardUse(MoneyCardUse moneyCardUse); /** * 根据订单id删除充值卡 * 只有没有被使用过的储值卡可以删除 * @param id */ void deleteByOrderItemId(Long id); /** * 储值卡退款 * @param id */ void moneyCardTk(List<MoneyCardOperationDto> moneyCardOperationDtos); } zq-erp/src/main/java/com/matrix/system/hive/service/SysBeauticianStateService.java
@@ -1,12 +1,11 @@ package com.matrix.system.hive.service; import java.util.Date; import java.util.List; import com.matrix.core.pojo.PaginationVO; import com.matrix.system.hive.bean.SysBeauticianState; import com.matrix.system.hive.plugin.util.BaseServices; import java.util.Date; import java.util.List; /** * @@ -75,7 +74,7 @@ public List<SysBeauticianState> findByTimeAndStaff(Long id, Date beginTime, Date endTime); public List<SysBeauticianState> findBySerId(Long serviceId); public List<SysBeauticianState> findBySerId(Long serviceId); } zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java
@@ -8,10 +8,7 @@ import com.matrix.system.hive.bean.SysOrder; import com.matrix.system.hive.plugin.util.BaseServices; import com.matrix.system.hive.pojo.CzXkVo; import com.matrix.system.hive.pojo.ShoppingCarItemsVo; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpSession; import java.math.BigDecimal; import java.util.List; @@ -83,19 +80,9 @@ * @date 2016年7月18日 上午11:14:07 * @throws */ public void updateReceiptMoney(SysOrder sysOrder) throws GlobleException; public void payOrder(SysOrder sysOrder) throws GlobleException; public void refundOrderMoney(SysOrder sysOrder); /** * 创建订单 * @param session * @param car * @return */ @Transactional(rollbackFor = Exception.class) public int createOrder(HttpSession session, ShoppingCarItemsVo car); public void orderTk(SysOrder sysOrder); /** * 补交 @@ -113,17 +100,7 @@ * @date 2016年9月20日 下午12:07:21 * @throws */ 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); public SysOrder moneyCardCz(CzXkVo czVo); /** * 校验订单是否满足结算条件 zq-erp/src/main/java/com/matrix/system/hive/service/SysOutStoreService.java
@@ -14,6 +14,7 @@ /** * 新增SysOutStore * 立即出库 * */ public int add(SysOutStore sysOutStore); @@ -60,7 +61,20 @@ */ public SysOutStore findById(Long id); public int checkInfo(SysOutStore sysOutStore); /** * 删除出库单,恢复库存 * @param id */ public void cancelOutStore(Long id); /** * 出库单审核通过,并扣减库存 * @param sysOutStore * @return */ public int effectOutStore(SysOutStore sysOutStore); zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java
@@ -2,8 +2,8 @@ import com.matrix.core.pojo.AjaxResult; 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 +135,16 @@ */ public AjaxResult activeProj(SysProjUse proj); /** * 添加用户套餐和项目 * * @param projUseDtoList * @return */ public void addUserProjUse(List<ProjUseOperationDto> projUseDtoList) ; public void projectTk(List<ProjUseOperationDto> projUseDtoList); public int updateProjUseTck(SysProjUse projUse); @@ -145,4 +154,11 @@ public List<SysProjUse> findTaocaoProjUseWithProj(SysProjUse sysProjUse); int findTaocanCountForCourseAndInfinite(Long taocanId, Long vipId); /** * 取消订单删除项目 * 只有没有使用过的才能被删除 * @param id */ void deleteByOrderItemId(Long id); } zq-erp/src/main/java/com/matrix/system/hive/service/SysVipInfoService.java
@@ -22,6 +22,13 @@ */ public interface SysVipInfoService extends BaseServices<SysVipInfo>{ /** * 更新用户成交状态 * @param vipId * @param isDeal */ void updateDealStatus(Long vipId, int isDeal); public MoneyCardUse addVipDefaultCard(Long vipId); /** * 新增SysVipInfo zq-erp/src/main/java/com/matrix/system/hive/service/imp/AchieveNewServiceImpl.java
@@ -164,7 +164,7 @@ @Override public void addAchieveByServiceOrder(SysProjServices projServices) { public void addAchieveByServiceOrder(SysProjServices projServices) { List<AchieveNew> achieveNewList = new ArrayList<>(); List<SysBeauticianState> beauticianStateList = sysBeauticianStateDao.selectBySerIds(projServices.getId()); int size = beauticianStateList.size(); @@ -188,16 +188,16 @@ // 是否为赠送业绩 if (Dictionary.TAOCAN_SOURCE_ZS.equals(projUse.getSource())) { achieveNew.setFreeConsume(projUse.getPrice()*beauticianState.getCount()); achieveNew.setFreeConsume(projUse.getPrice() * beauticianState.getCount()); //计算提成 achieveNew.setProjPercentage( calculationProjPercentage(AchieveRuleItem.ACHIEVE_TYPE_ZS,achieveNew.getFreeConsume(),beauticianState.getProjId())); calculationProjPercentage(AchieveRuleItem.ACHIEVE_TYPE_ZS, achieveNew.getFreeConsume(), beauticianState.getProjId())); } else { achieveNew.setHisConsume(new BigDecimal(projUse.getPrice()*beauticianState.getCount()).setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue()); achieveNew.setHisConsume(new BigDecimal(projUse.getPrice() * beauticianState.getCount()).setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue()); //计算提成 achieveNew.setProjPercentage( calculationProjPercentage(AchieveRuleItem.ACHIEVE_TYPE_BJ,achieveNew.getHisConsume(),beauticianState.getProjId())); calculationProjPercentage(AchieveRuleItem.ACHIEVE_TYPE_BJ, achieveNew.getHisConsume(), beauticianState.getProjId())); } achieveNew.setT2(projUse.getSource()); achieveNew.setDatatime(new Date()); @@ -211,14 +211,14 @@ if (flag) { // if (!achieveId.equals(beauticianState.getStaffId())) { AchieveNew saleManAchieve = new AchieveNew(); BeanUtils.copyProperties(achieveNew, saleManAchieve); saleManAchieve.setBeaultId(achieveId); AchieveNew saleManAchieve = new AchieveNew(); BeanUtils.copyProperties(achieveNew, saleManAchieve); saleManAchieve.setBeaultId(achieveId); saleAchieveNumOfPeople(saleManAchieve); //销售人员不计算项目提成 saleManAchieve.setProjPercentage(0D); achieveNewList.add(saleManAchieve); saleAchieveNumOfPeople(saleManAchieve); //销售人员不计算项目提成 saleManAchieve.setProjPercentage(0D); achieveNewList.add(saleManAchieve); // } } @@ -260,34 +260,35 @@ AchieveRuleDao achieveRuleDao; private Double calculationProjPercentage(int type, Double consume, Long goodsId) { ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(goodsId); if(shoppingGoods.getAchieveRuleId()!=null){ ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(goodsId); if (shoppingGoods.getAchieveRuleId() != null) { AchieveRule achieveRule = achieveRuleDao.selectById(shoppingGoods.getAchieveRuleId()); if(achieveRule!=null){ List<AchieveRuleItem> achieveRuleItems = JSONUtil.toList(JSONUtil.parseArray(achieveRule.getRules()), AchieveRuleItem.class); double percentage=0D; for(AchieveRuleItem item:achieveRuleItems){ if(item.getAchieveType()==type && (item.getLower() == consume || (item.getLower()< consume && consume < item.getUpper() ))){ AchieveRule achieveRule = achieveRuleDao.selectById(shoppingGoods.getAchieveRuleId()); if (achieveRule != null) { List<AchieveRuleItem> achieveRuleItems = JSONUtil.toList(JSONUtil.parseArray(achieveRule.getRules()), AchieveRuleItem.class); double percentage = 0D; for (AchieveRuleItem item : achieveRuleItems) { if (item.getAchieveType() == type && (item.getLower() == consume || (item.getLower() < consume && consume < item.getUpper()))) { if(AchieveRuleItem.ACHIEVE_TYPE_FIXED==item.getCalculationType()){ percentage=item.getAchieve(); }else{ percentage= consume * (item.getAchieve()/100); } break; } } return percentage; } } if (AchieveRuleItem.ACHIEVE_TYPE_FIXED == item.getCalculationType()) { percentage = item.getAchieve(); } else { percentage = consume * (item.getAchieve() / 100); } break; } } return percentage; } } return 0D; } /** * 顾问人头业绩 * * @param achieveNew */ private void saleAchieveNumOfPeople(AchieveNew achieveNew) { @@ -301,7 +302,6 @@ } /** * * 合并订单与服务单人头逻辑,即每一个客户对美疗师/顾问来说,每一天同一个客户只算一个人头。 * 如若A给客户X下订单,并给客户X服务,对A来说只算一个人头 */ @@ -333,10 +333,9 @@ if (orderItem != null && CollectionUtils.isNotEmpty(orderItem.getAchieveList())) { for (AchieveNew achieveNew : orderItem.getAchieveList()) { if (achieveNew !=null && achieveNew.getGoodsCash()!=null) { buildAchieve(pageOrder, orderItem, achieveNew); if (achieveNew != null && achieveNew.getGoodsCash() != null) { buildAchieve(pageOrder, orderItem, achieveNew); achieveNewList.add(achieveNew); beautyIds.add(achieveNew.getBeaultId()); } } @@ -358,7 +357,7 @@ BusParameterSettingsDao busParameterSettingsDao; private void buildAchieve(SysOrder pageOrder, SysOrderItem orderItem, AchieveNew achieveNew) { BusParameterSettings shopManageJjcpasConsume =null; BusParameterSettings shopManageJjcpasConsume = null; if (Dictionary.ORDER_STATU_TK.equals(pageOrder.getStatu())) { achieveNew.setId(null); achieveNew.setProjPercentage(0 - achieveNew.getProjPercentage()); @@ -366,7 +365,7 @@ } achieveNew.setVipId(pageOrder.getVipId()); if(achieveNew.getSaleId()==null){ if (achieveNew.getSaleId() == null) { achieveNew.setSaleId(pageOrder.getStaffId()); } @@ -376,11 +375,12 @@ } else { achieveNew.setDatatime(new Date()); } if(Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(orderItem.getShoppingGoods().getGoodType())){ if(shopManageJjcpasConsume==null){ ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(orderItem.getGoodsId()); if (Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(shoppingGoods.getGoodType())) { if (shopManageJjcpasConsume == null) { shopManageJjcpasConsume = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.SHOP_MANAGE_JJCPAS_CONSUME, pageOrder.getCompanyId()); } if(AppConstance.IS_Y.equals(shopManageJjcpasConsume.getParamValue())){ if (AppConstance.IS_Y.equals(shopManageJjcpasConsume.getParamValue())) { achieveNew.setHisConsume(achieveNew.getGoodsCash()); } @@ -440,7 +440,7 @@ Date endTime = calendar.getTime(); switch (type) { // 本日 case 1 : case 1: break; // 昨日 case 2: @@ -489,4 +489,9 @@ public int findDailyBeautyListTotal(AchieveNew achieveNew) { return achieveNewDao.selectDailyBeautyListTotal(achieveNew); } @Override public void removeByOrderId(Long orderId) { achieveNewDao.deleteByOrderId(orderId); } } zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
@@ -1,29 +1,40 @@ package com.matrix.system.hive.service.imp; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.core.tools.LogUtil; import com.matrix.system.common.dao.SysUsersDao; import com.matrix.system.common.validate.GroupValidateStatusCheckUtil; import com.matrix.system.common.validate.group.Group; import com.matrix.system.constance.Dictionary; import com.matrix.system.hive.bean.MoneyCardUse; import com.matrix.system.hive.bean.MoneyCardUseFreeze; import com.matrix.system.hive.bean.SysOrderItem; import com.matrix.system.hive.bean.SysVipInfo; import com.matrix.system.hive.bean.*; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.dto.MoneyCardOperationDto; 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.service.SysOrderService; import com.matrix.system.hive.validation.MoneyCardUseGroup; 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 @@ -39,11 +50,333 @@ private SysOrderItemDao orderItemDao; @Autowired SysOrderService sysOrderService; @Autowired private SysVipLevelDao viplevelDao; @Autowired ShoppingGoodsDao shoppingGoodsDao; @Autowired MoneyCardAssembleDao moneyCardAssembleDao; @Autowired MoneyCardUseFlowDao moneyCardUseFlowDao; @Autowired SysUsersDao sysUsersDao; @Autowired private ShoppingGoodsService shoppingGoodsService; @Override @Transactional(rollbackFor = Exception.class) public void addVipMoneyCard(List<MoneyCardOperationDto> moneyCardOperationDtos) { moneyCardOperationDtos.forEach(dto -> { //参数校验 GroupValidateStatusCheckUtil.check(dto,Group.ADD.class); ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(dto.getGoodsId()); MoneyCardUse moneyCardUse = new MoneyCardUse(); BeanUtil.copyProperties(dto, moneyCardUse); moneyCardUse.setGiftMoney(shoppingGoods.getReferencePice()); moneyCardUse.setRealMoney(shoppingGoods.getSealPice()); moneyCardUse.setGoodsId(shoppingGoods.getId()); moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX); moneyCardUse.setIsVipCar(Dictionary.FLAG_NO_N); moneyCardUse.setCardName(shoppingGoods.getName()); //余次处理 if (shoppingGoods.getCarUseCount() == null || shoppingGoods.getCarUseCount() == 0) { moneyCardUse.setUseTotal(999999999); moneyCardUse.setLastCount(999999999); } else { moneyCardUse.setUseTotal(shoppingGoods.getCarUseCount()); moneyCardUse.setLastCount(shoppingGoods.getCarUseCount()); } //失效时间处理 Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 1, null); moneyCardUse.setFailTime(invalidTime); moneyCardUseDao.insert(moneyCardUse); }); } @Override public void deleteByOrderItemId(Long orderItemId) { List<MoneyCardUse> moneyCardUseList = getMoneyCardUseListByOrderItemId(orderItemId); moneyCardUseList.forEach(moneyCardUse -> { MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow(); moneyCardUseFlow.setCarUseId(moneyCardUse.getId()); int i = moneyCardUseFlowDao.selectTotalRecord(moneyCardUseFlow); if(i>0){ throw new GlobleException(moneyCardUse.getCardName()+"储值卡已经被启用无法删除"); }else { LogUtil.info("根据订单明细id{},删除储值卡:{}", orderItemId,moneyCardUse.getCardName()); moneyCardUseDao.deleteById(moneyCardUse.getId()); } }); } @Override public void moneyCardTk(List<MoneyCardOperationDto> moneyCardOperationDtos) { moneyCardOperationDtos.forEach(moneyCardOperationDto -> { GroupValidateStatusCheckUtil.check(moneyCardOperationDto, MoneyCardUseGroup.moneyCardUseTk.class); List<MoneyCardUse> moneyCardUseList = getMoneyCardUseListByOrderItemId(moneyCardOperationDto.getOrderItemId()); for (MoneyCardUse moneyCardUse : moneyCardUseList) { //本金扣款 if (moneyCardUse.getRealMoney() + moneyCardOperationDto.getRealMoney() >= 0) { double surplus = MoneyUtil.add(moneyCardUse.getRealMoney(), moneyCardOperationDto.getRealMoney()); moneyCardUse.setRealMoney(surplus); } else { throw new GlobleException(moneyCardUse.getCardName() + "余额不足"); } //余额为0时充值卡变为无效 if (moneyCardUse.getRealMoney().equals(0D)) { moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); moneyCardUse.setStatus(Dictionary.TAOCAN_STATUS_TK); } moneyCardUse.setGiftMoney(0D); moneyCardUseDao.update(moneyCardUse); saveMoneyCardUseFlow(moneyCardOperationDto,moneyCardUse); } }); } /** * 根据订单明细id查询会员卡 * @param orderItemId * @return */ private List<MoneyCardUse> getMoneyCardUseListByOrderItemId(Long orderItemId) { LambdaQueryWrapper<MoneyCardUse> lambdaQueryChainWrapper = new LambdaQueryWrapper(); lambdaQueryChainWrapper.eq(MoneyCardUse::getOrderItemId, orderItemId); List<MoneyCardUse> moneyCardUseList = list(lambdaQueryChainWrapper); return moneyCardUseList; } /** * 保存储值卡流水 * @param moneyCardOperationDto * @param moneyCardUse */ private void saveMoneyCardUseFlow(MoneyCardOperationDto moneyCardOperationDto,MoneyCardUse moneyCardUse){ MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow(); moneyCardUseFlow.setCarUseId(moneyCardUse.getId()); moneyCardUseFlow.setOrderNo(moneyCardOperationDto.getOrderNo()); moneyCardUseFlow.setVipId(moneyCardUse.getVipId()); moneyCardUseFlow.setTimes(moneyCardUse.getLastCount()); moneyCardUseFlow.setType(moneyCardOperationDto.getType()); moneyCardUseFlow.setCreateTime(new Date()); moneyCardUseFlow.setOperationId(moneyCardOperationDto.getUpdateUser()); moneyCardUseFlow.setTotal(moneyCardUse.getRealMoney()); moneyCardUseFlow.setGiftMoney(moneyCardUse.getGiftMoney()); moneyCardUseFlow.setTotal(moneyCardOperationDto.getRealMoney()); moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney()); moneyCardUseFlow.setStaffName(sysUsersDao.selectById(moneyCardOperationDto.getUpdateUser()).getSuName()); moneyCardUseFlowDao.insert(moneyCardUseFlow); } @Override @Transactional(rollbackFor = Exception.class) public void changeMoneyCard(List<MoneyCardOperationDto> moneyCardOperationDtoList) { moneyCardOperationDtoList.forEach(moneyCardOperationDto -> { if (MoneyCardUseFlow.USE_TYPE_CONSUMER.equals(moneyCardOperationDto.getType())) { //储值卡支付订单 扣减储值卡余额 GroupValidateStatusCheckUtil.check(moneyCardOperationDto,MoneyCardUseGroup.moneyCardUseOrderChange.class); moneyCardPayOrder(moneyCardOperationDto); } else if (MoneyCardUseFlow.USE_TYPE_ORDRE_CANCEL.equals(moneyCardOperationDto.getType())) { //回退储值卡余额 GroupValidateStatusCheckUtil.check(moneyCardOperationDto,MoneyCardUseGroup.moneyCardUseOrderChange.class); returnMoneyCard(moneyCardOperationDto); } else if (MoneyCardUseFlow.USE_TYPE_CZ.equals(moneyCardOperationDto.getType())) { //回退储值卡余额 GroupValidateStatusCheckUtil.check(moneyCardOperationDto,MoneyCardUseGroup.moneyCardUseCz.class); moneyCardCz(moneyCardOperationDto); } }); } /** * 会员卡充值 * @param moneyCardOperationDto */ private void moneyCardCz(MoneyCardOperationDto moneyCardOperationDto) { LogUtil.info("会员卡充值 {}", JSON.toJSONString(moneyCardOperationDto)); MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardOperationDto.getCarUseId()); if (Objects.nonNull(moneyCardOperationDto.getGiftMoney())) { //jyytodo 余额余次的修改和新增在数据库层面做加减 moneyCardUse.setGiftMoney(moneyCardUse.getGiftMoney() + moneyCardOperationDto.getGiftMoney()); } if (Objects.nonNull(moneyCardOperationDto.getRealMoney())) { moneyCardUse.setRealMoney(moneyCardUse.getRealMoney() + moneyCardOperationDto.getRealMoney()); } moneyCardUseDao.update(moneyCardUse); //设置卡项使用流水 saveMoneyCardUseFlow(moneyCardOperationDto,moneyCardUse); } /** * 回退储值卡余额 * * @param moneyCardOperationDto */ private void returnMoneyCard(MoneyCardOperationDto moneyCardOperationDto) { LogUtil.info("回退储值卡余额 {}", JSON.toJSONString(moneyCardOperationDto)); MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardOperationDto.getCarUseId()); MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow(); if (Objects.nonNull(moneyCardOperationDto.getGiftMoney())) { //jyytodo 余额余次的修改和新增在数据库层面做加减 moneyCardUse.setGiftMoney(moneyCardUse.getGiftMoney() + moneyCardOperationDto.getGiftMoney()); } if (Objects.nonNull(moneyCardOperationDto.getRealMoney())) { moneyCardUse.setRealMoney(moneyCardUse.getRealMoney() + moneyCardOperationDto.getRealMoney()); } moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX); moneyCardUseDao.update(moneyCardUse); //设置卡项使用流水 saveMoneyCardUseFlow(moneyCardOperationDto,moneyCardUse); } /** * 储值卡支付订单 扣减储值卡余额 * * @param moneyCardOperationDto */ private void moneyCardPayOrder(MoneyCardOperationDto moneyCardOperationDto) { // 判断商品是否在充值卡的限制购买 VerificationResult verificationResult = checkIsBangding(moneyCardOperationDto.getCarUseId(), moneyCardOperationDto.getGoodsIds()); if (!verificationResult.isJudgeResult()) { throw new GlobleException(verificationResult.getMsg()); } LogUtil.info("扣减储值卡余额 {}", JSON.toJSONString(moneyCardOperationDto)); MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(moneyCardOperationDto.getCarUseId()); //欠款检查 checkOrderStatu(moneyCardUse.getOrderItemId()); //赠送金额扣款 if (moneyCardUse.getGiftMoney() + moneyCardOperationDto.getGiftMoney() >= 0) { double surplus = MoneyUtil.add(moneyCardUse.getGiftMoney(), moneyCardOperationDto.getGiftMoney()); moneyCardUse.setGiftMoney(surplus); } else { throw new GlobleException(moneyCardUse.getCardName() + "余额不足"); } //本金扣款 if (moneyCardUse.getRealMoney() + moneyCardOperationDto.getRealMoney() >= 0) { double surplus = MoneyUtil.add(moneyCardUse.getRealMoney(), moneyCardOperationDto.getRealMoney()); moneyCardUse.setRealMoney(surplus); } 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() - moneyCardOperationDto.getCount()); // 更新充值卡信息 moneyCardUseDao.update(moneyCardUse); //设置卡项使用流水 saveMoneyCardUseFlow(moneyCardOperationDto,moneyCardUse); } /** * 检查商品是否在储值卡的消费范围内 * * @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 VerificationResult.success(); } else { // 不是默认储值卡判断卡是否可应用于所有产品 ShoppingGoods cardGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId()); if (cardGoods != null) { if (Dictionary.FLAG_YES.equals(cardGoods.getCarIsAll())) { return VerificationResult.success(); } } // 比较分类 MoneyCardAssemble moneyCardAssemble = new MoneyCardAssemble(); moneyCardAssemble.setCardId(moneyCardUse.getGoodsId()); List<MoneyCardAssemble> cardAssembleList = moneyCardAssembleDao.selectByModel(moneyCardAssemble); 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() + "优惠中 "); } } if (msgBuilder.length() > 0) { return VerificationResult.fail(msgBuilder.toString()); } else { return VerificationResult.success(); } } } @Override public int add(MoneyCardUse moneyCardUse) { @@ -160,6 +493,7 @@ @Transactional(rollbackFor = Exception.class) public void transfer(MoneyCardUse moneyCardUse, Long vipId2, Double money) { Long oldId = moneyCardUse.getId(); moneyCardUse = moneyCardUseDao.selectById(moneyCardUse.getId()); if (moneyCardUse.getVipId().equals(vipId2)) { throw new GlobleException("转让人不能是该充值卡拥有者!"); @@ -217,7 +551,6 @@ } //设置为有效 @Override public void active(MoneyCardUse proj) { @@ -246,10 +579,10 @@ /** * 检测订单条目是否已付款完毕 */ public void checkOrderStatu(Long id) { SysOrderItem item = orderItemDao.selectById(id); if (!Dictionary.ORDER_STATU_YFK.equals(item.getStatus())) { throw new GlobleException("该商品还存在欠款!"); public void checkOrderStatu(Long orderItemId) { SysOrder order = sysOrderService.findById(orderItemDao.selectById(orderItemId).getOrderId()); if (!Dictionary.ORDER_STATU_YFK.equals(order.getStatu())) { throw new GlobleException("储值卡购买订单还存在欠款,在补交欠款后才能使用!"); } } zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java
@@ -18,7 +18,7 @@ import com.matrix.system.hive.bean.SysShopInfo; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.dto.GoodsSealLimitDto; import com.matrix.system.hive.dto.OrderItemDto; import com.matrix.system.hive.dto.SysOrderItemDto; import com.matrix.system.hive.service.ShoppingGoodsService; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -64,17 +64,17 @@ //校验参数不能为空 checkGoodsSelLimtParam(goodsSealLimitDto); goodsSealLimitDto.getOrderItemDtoList().forEach(item -> { goodsSealLimitDto.getSysOrderItemDtoList().forEach(item -> { ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId()); //最大销售次数检测 Integer maxNum = shopGoods.getCarMaxSaleCount(); if (maxNum != null && maxNum != 0) { Integer buyNum = orderItemDao.selectByGoodsId(shopGoods.getId(), null); if ((buyNum + item.getCount()) == maxNum) { if (buyNum.equals(maxNum)) { if (!shopGoods.getStaus().equals(Dictionary.BUSINESS_STATE_DOWN)) { shopGoods.setStaus(Dictionary.BUSINESS_STATE_DOWN); shoppingGoodsDao.update(shopGoods); LogUtil.info("{}商品达到最大销售数量自动下架",shopGoods.getName()); LogUtil.info("商品达到最大销售数量自动下架:{}", shopGoods.getName()); } } else if ((buyNum + item.getCount()) > maxNum) { throw new GlobleException(shopGoods.getName() + "已超过最大销售数量"); @@ -92,17 +92,14 @@ } private void checkGoodsSelLimtParam(GoodsSealLimitDto goodsSealLimitDto) { ParamCheckUtil.requireNonNulls(goodsSealLimitDto, goodsSealLimitDto.getVipId(), goodsSealLimitDto.getOrderItemDtoList()); goodsSealLimitDto.getSysOrderItemDtoList()); ParamCheckUtil.requireListElementNonNull(goodsSealLimitDto.getOrderItemDtoList(), Arrays.asList(OrderItemDto::getCount, OrderItemDto::getGoodsId)); ParamCheckUtil.requireListElementNonNull(goodsSealLimitDto.getSysOrderItemDtoList(), Arrays.asList(SysOrderItemDto::getCount, SysOrderItemDto::getGoodsId)); } @@ -391,9 +388,6 @@ shoppingGoods.setIsAssemble(Dictionary.FLAG_NO); break; case Dictionary.SHOPPING_GOODS_TYPE_TC: shoppingGoods.setIsAssemble(Dictionary.FLAG_YES); break; case Dictionary.SHOPPING_GOODS_TYPE_ZHK: shoppingGoods.setIsAssemble(Dictionary.FLAG_YES); break; } zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysInstoreInfoServiceImpl.java
@@ -1,9 +1,11 @@ package com.matrix.system.hive.service.imp; import com.alibaba.fastjson.JSON; import com.matrix.core.constance.MatrixConstance; import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.DateUtil; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.WebUtil; import com.matrix.system.common.bean.SysUsers; import com.matrix.system.constance.Dictionary; @@ -50,11 +52,7 @@ sysInstoreInfo.setCheckStatus(Dictionary.CHECK_STATUS_DSH); // 设置入库单编号 sysInstoreInfo.setInstoreId(DateUtil.getTimeMark()); // SysShopInfo info = shopInfoDao.selectByShopName(Dictionary.SHOP_NAME_ZONGDIAN); // // 系统限制入库只能入库到总店,总店不存在则 // if (info == null) { // throw new GlobleException("总店仓库不存在,请添加!"); // } // 插入 int i = sysInstoreInfoDao.insert(sysInstoreInfo); // 设置总金额,并更新 @@ -180,6 +178,7 @@ @Override @Transactional(rollbackFor = Exception.class) public int check(SysInstoreInfo sysInstoreInfo) { LogUtil.info("入库单审核:{}", JSON.toJSONString(sysInstoreInfo)); // 验证权限 SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); sysInstoreInfo.setAppmanId(user.getSuId()); @@ -187,9 +186,6 @@ sysInstoreInfo.setCompanyId(user.getCompanyId()); SysInstoreInfo checkInStore = sysInstoreInfoDao.selectById(sysInstoreInfo.getId()); // if (!checkInStore.getAppmanId().equals(user.getSuId())) { // throw new GlobleException("无权审核该单据!"); // } if (!checkInStore.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH)) { throw new GlobleException("该单据状态为" + checkInStore.getCheckStatus() + ",不可审核!"); } zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceHelper.java
New file @@ -0,0 +1,844 @@ /** * projectName: zq-erp * fileName: SysOrderServiceHelper.java * packageName: com.matrix.system.hive.service.imp * date: 2022-03-11 9:33 * copyright(c) 2022 http://www.hydee.cn/ Inc. All rights reserved. */ package com.matrix.system.hive.service.imp; 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.DateUtil; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.StringUtils; 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.common.service.OperationLogService; import com.matrix.system.constance.Dictionary; import com.matrix.system.enums.OperationButtonEnum; import com.matrix.system.enums.OperationFunctionEnum; import com.matrix.system.hive.bean.*; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.dto.MoneyCardOperationDto; import com.matrix.system.hive.dto.ProjUseOperationDto; import com.matrix.system.hive.plugin.util.CollectionUtils; import com.matrix.system.hive.plugin.util.MoneyUtil; import com.matrix.system.hive.pojo.CzXkVo; import com.matrix.system.hive.service.*; import com.matrix.system.score.constant.ScoreSettingConstant; import com.matrix.system.score.entity.ScoreVipDetail; import com.matrix.system.score.service.ScoreVipDetailService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.validation.constraints.NotEmpty; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * @version: V1.0 * @author: JiangYouYao * @className: SysOrderServiceHelper * @packageName: com.matrix.system.hive.service.imp * @description: 订单服务助手 * @data: 2022-03-11 9:33 **/ @Component public class SysOrderServiceHelper { @Autowired SysInstoreInfoService sysInstoreInfoService; @Autowired private SysSupplierInfoDao sysSupplierInfoDao; @Autowired ScoreVipDetailService scoreVipDetailService; @Autowired SysVipInfoDao sysVipInfoDao; @Autowired private SysStoreInfoDao storeInfoDao; @Autowired private SysProjUseService sysProjUseService; @Autowired SysOutStoreDao sysOutStoreDao; @Autowired private CodeService codeService; @Autowired ShoppingGoodsAssembleDao shoppingGoodsAssembleDao; @Autowired SysOutStoreItemDao sysOutStoreItemDao; @Autowired private SysOrderDao sysOrderDao; @Autowired private OperationLogService operationLogService; @Autowired ShoppingGoodsDao shoppingGoodsDao; @Autowired private SysOrderFlowDao sysOrderFlowDao; @Autowired BusParameterSettingsDao busParameterSettingsDao; @Autowired private WarehouseDao warehouseDao; @Autowired MoneyCardUseService moneyCardUseService; @Autowired private SysOrderItemDao orderItemDao; @Autowired MoneyCardUseDao moneyCardUseDao; /** * 创建支付流水 * * @author:姜友瑶 */ public void addOrderFlow(SysOrder sourceOrder, boolean isBj) { LogUtil.info("创建支付流水 id={}", sourceOrder.getId()); //处理支付流水 int flowCount = 1; for (SysOrderFlow flow : sourceOrder.getFlows()) { flow.setFlowNo(codeService.getFlowCode() + "-" + flowCount); flow.setVipId(sourceOrder.getVipId()); flow.setShopId(sourceOrder.getShopId()); flow.setCompanyId(sourceOrder.getCompanyId()); //支付内容摘要设置 Long goodsId = sourceOrder.getItems().get(0).getGoodsId(); ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId); flow.setFlowContent(goods.getName() + "等" + sourceOrder.getItems().size() + "件产品"); // 若是退款,则取负数 if (SysOrder.ORDER_TYPE_REFUND == sourceOrder.getOrderType()) { flow.setFlowType(SysOrderFlow.FLOW_TYPE_REFUND); flow.setAmount(flow.getAmount().negate()); flow.setOrderId(sourceOrder.getOldOrderId()); } else { if (isBj) {//jyytodo 优化不能根据isbj来判断流水类型 flow.setFlowType(SysOrderFlow.FLOW_TYPE_REPAY); } else { flow.setFlowType(SysOrderFlow.FLOW_TYPE_BUY); } flow.setOrderId(sourceOrder.getId()); } sysOrderFlowDao.insert(flow); flowCount++; } } /** * 新增项目和套餐的余次 * * @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); } SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); projUseOperationDto.setPayMoney(sysOrderItem.getZkPrice()); projUseOperationDto.setGoodsId(sysOrderItem.getGoodsId()); projUseOperationDto.setCount(sysOrderItem.getCount()); projUseOperationDto.setVipId(order.getVipId()); projUseOperationDto.setOrderItemId(sysOrderItem.getId()); projUseOperationDto.setUpdateUserId(sysUsers.getSuId()); 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<MoneyCardOperationDto> moneyCardOperationDtos = Lists.newArrayList(); flows.forEach(flow -> { if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) { if (flow.getCardId() != null) { MoneyCardOperationDto dto = new MoneyCardOperationDto(); 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()); dto.setRealMoney(0D); } else { dto.setRealMoney(-flow.getAmount().doubleValue()); dto.setGiftMoney(0D); } dto.setUpdateUser(user.getSuId()); dto.setGoodsIds(goodsIds); moneyCardOperationDtos.add(dto); } else { throw new GlobleException("无效的储值卡支付方式"); } } }); if (CollectionUtils.isNotEmpty(moneyCardOperationDtos)) { LogUtil.info("扣除储值卡余额{}", JSON.toJSONString(moneyCardOperationDtos)); moneyCardUseService.changeMoneyCard(moneyCardOperationDtos); } } /** * 储值卡退款 * @param order */ public void returnMoneyCardPay(SysOrder order) { SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); List<MoneyCardOperationDto> moneyCardOperationDtos = Lists.newArrayList(); List<SysOrderFlow> flows = sysOrderFlowDao.selectByOrderId(order.getId()); // 非现金收款退回扣卡余额 for (SysOrderFlow flow : flows) { if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) { if (flow.getCardId() != null) { MoneyCardOperationDto dto = new MoneyCardOperationDto(); dto.setOrderNo(order.getOrderNo()); dto.setOrderId(order.getId()); dto.setCount(1); dto.setCarUseId(flow.getCardId()); dto.setType(MoneyCardUseFlow.USE_TYPE_ORDRE_CANCEL); if (SysOrderFlow.IS_GIFT_Y.equals(flow.getIsGift())) { dto.setGiftMoney(flow.getAmount().doubleValue()); } else { dto.setRealMoney(flow.getAmount().doubleValue()); } dto.setUpdateUser(user.getSuId()); moneyCardOperationDtos.add(dto); } else { throw new GlobleException("无效的储值卡支付方式"); } } } if (CollectionUtils.isNotEmpty(moneyCardOperationDtos)) { LogUtil.info("退回储值卡余额{}", JSON.toJSONString(moneyCardOperationDtos)); moneyCardUseService.changeMoneyCard(moneyCardOperationDtos); } } /** * @param sourceOrder 如果购买了充值卡设置会员的充值卡 * @author:姜友瑶 * @date 2016年9月19日 */ public void addMoneyCardUse(SysOrder sourceOrder) { SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); 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(); // 是否为赠送 if (sysOrderItem.getIsFree().equals(Dictionary.FLAG_YES)) { moneyCardOperationDto.setSource(Dictionary.TAOCAN_SOURCE_ZS); } else { moneyCardOperationDto.setSource(Dictionary.TAOCAN_SOURCE_GM); } moneyCardOperationDto.setType(MoneyCardUseFlow.USE_TYPE_GM); moneyCardOperationDto.setOrderItemId(sysOrderItem.getId()); moneyCardOperationDto.setGoodsId(sysOrderItem.getGoodsId()); moneyCardOperationDto.setOrderId(sourceOrder.getId()); moneyCardOperationDto.setOrderNo(sourceOrder.getOrderNo()); moneyCardOperationDto.setVipId(sourceOrder.getVipId()); moneyCardOperationDto.setUpdateUser(user.getSuId()); moneyCardOperationDtos.add(moneyCardOperationDto); } } } if (CollUtil.isNotEmpty(moneyCardOperationDtos)) { moneyCardUseService.addVipMoneyCard(moneyCardOperationDtos); } } /** * 新增出库单并更新本店库存 * jyytodo 继续优化 * * @param order */ public void addOutStore(SysOrder order) { BusParameterSettings manageStockSetting = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WAREHOUSE_MANAGE_STOCK, order.getCompanyId()); if (AppConstance.IS_Y.equals(manageStockSetting.getParamValue())) { List<SysOutStoreItem> storeItemList = new ArrayList<>(); for (SysOrderItem sysOrderItem : order.getItems()) { if (ShoppingGoods.SHOPPING_GOODS_TYPE_JJCP.equals(sysOrderItem.getType())) { SysOutStoreItem storeItem = new SysOutStoreItem(); storeItem.setSkuId(sysOrderItem.getGoodsId()); storeItem.setAmount(Double.valueOf(sysOrderItem.getCount())); storeItemList.add(storeItem); } else if (ShoppingGoods.SHOPPING_GOODS_TYPE_TC.equals(sysOrderItem.getType()) || ShoppingGoods.SHOPPING_GOODS_TYPE_ZHK.equals(sysOrderItem.getType())) { List<ShoppingGoodsAssemble> goodsList = new ArrayList<>(); goodsList.addAll(shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(sysOrderItem.getGoodsId(), ShoppingGoods.SHOPPING_GOODS_TYPE_JJCP)); if (ShoppingGoods.SHOPPING_GOODS_TYPE_ZHK.equals(sysOrderItem.getType())) { //综合卡处理,中的套餐,中的家居产品 List<ShoppingGoodsAssemble> zhkAssemble = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(sysOrderItem.getGoodsId(), ShoppingGoods.SHOPPING_GOODS_TYPE_TC); zhkAssemble.forEach(item -> { goodsList.addAll(shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(item.getAssembleGoodId(), ShoppingGoods.SHOPPING_GOODS_TYPE_JJCP)); }); } goodsList.forEach(item -> { SysOutStoreItem storeItem = new SysOutStoreItem(); storeItem.setSkuId(item.getAssembleGoodId()); storeItem.setAmount(Double.valueOf(item.getTotal())); storeItemList.add(storeItem); }); } } if (CollectionUtils.isNotEmpty(storeItemList)) { Long warehouseId = warehouseDao.findShopWarehouse(order.getShopId()).get(0).getId(); SysOutStore outStore = new SysOutStore(); outStore.setOutStoreNo(codeService.getOutStoreCode()); outStore.setOrderId(order.getId()); outStore.setShopId(order.getShopId()); outStore.setShopId(order.getShopId()); outStore.setStaffId(order.getStaffId()); outStore.setType(Dictionary.OUT_STORE_JJCPCK); outStore.setServiceNo(order.getOrderNo()); outStore.setTime(new Date()); outStore.setCheckStatus(Dictionary.CHECK_STATUS_DSH); outStore.setCompanyId(order.getCompanyId()); sysOutStoreDao.insert(outStore); //出库明细,根据批次维度定义 List<SysOutStoreItem> realOutStoreItemList = new ArrayList<>(); storeItemList.forEach(outStoreItem -> { //设置出库主键 outStoreItem.setOutStoreId(outStore.getId()); //计算库存总数是否满足本次扣减的需求 List<SysStoreInfo> stores = storeInfoDao.selectStoInfoBySku(outStoreItem.getSkuId(), warehouseId); double sum = stores.stream().mapToDouble(item -> item.getStoreTotal()).sum(); if (sum < outStoreItem.getAmount()) { ShoppingGoods sysGoods = shoppingGoodsDao.selectById(outStoreItem.getSkuId()); if (sysGoods != null) { throw new GlobleException("出库失败:【" + sysGoods.getName() + "库存不足】"); } else { throw new GlobleException("出库失败没有找到出库产品"); } } //循环获取所有批次产品,并扣减库存 Double number = outStoreItem.getAmount(); for (SysStoreInfo storeInfo : stores) { Double oldStoreTotal = storeInfo.getStoreTotal(); Double surplus = storeInfo.getStoreTotal() - number; //更新库存 storeInfo.setStoreTotal(surplus < 0 ? 0 : surplus); //每次扣减库存都创建一个出库记录 SysOutStoreItem sysOutStoreItem = new SysOutStoreItem(); BeanUtils.copyProperties(outStoreItem, sysOutStoreItem); sysOutStoreItem.setStoreId(storeInfo.getId()); sysOutStoreItem.setAmount(oldStoreTotal - storeInfo.getStoreTotal()); realOutStoreItemList.add(sysOutStoreItem); storeInfoDao.update(storeInfo); //扣除后剩余库存大于0则跳出扣除,否则剩余数量的负数的绝对值就是再次扣减的数量 if (surplus > 0) { break; } else { number = Math.abs(surplus); } } }); sysOutStoreItemDao.batchInsert(realOutStoreItemList); } } else { LogUtil.debug("不管理库存"); } } /** * 设置会员消费积分 * * @param pageOrder */ public void addVipScore(SysOrder pageOrder) { SysVipInfo vipInfo = sysVipInfoDao.selectById(pageOrder.getVipId()); List<SysOrderFlow> flows = pageOrder.getFlows(); int[] cashScore = {0, 0, 0}; //现金支付金额 BigDecimal cashPayAmount = flows.stream() .filter(item -> (!item.getPayMethod().equals("储值卡")) && (!item.getPayMethod().equals("欠款"))) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BusParameterSettings cashConsumption = busParameterSettingsDao.selectCompanyParamByCode(ScoreSettingConstant.CASH_CONSUMPTION, vipInfo.getCompanyId()); if (cashPayAmount != null && cashPayAmount.compareTo(BigDecimal.ZERO) > 0 && StringUtils.isNotBlank(cashConsumption.getParamValue())) { BigDecimal scoreSetting0 = new BigDecimal(cashConsumption.getParamValue()); if (scoreSetting0.compareTo(BigDecimal.ZERO) > 0) { cashScore[0] = cashPayAmount.divide(scoreSetting0).intValue(); } if (StringUtils.isNotBlank(cashConsumption.getParamValue1())) { BigDecimal scoreSetting1 = new BigDecimal(cashConsumption.getParamValue1()); if (scoreSetting1.compareTo(BigDecimal.ZERO) > 0) { cashScore[1] = cashPayAmount.divide(scoreSetting1).intValue(); } } if (StringUtils.isNotBlank(cashConsumption.getParamValue2())) { BigDecimal scoreSetting2 = new BigDecimal(cashConsumption.getParamValue2()); if (scoreSetting2.compareTo(BigDecimal.ZERO) > 0) { cashScore[2] = cashPayAmount.divide(scoreSetting2).intValue(); } } } int[] cardScore = {0, 0, 0}; //储值卡本金支付金额 BigDecimal cardPayAmount = flows.stream() .filter(item -> item.getPayMethod().equals("储值卡") && item.getIsGift().equals("N")) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BusParameterSettings principalBalanceConsumption = busParameterSettingsDao.selectCompanyParamByCode(ScoreSettingConstant.PRINCIPAL_BALANCE_CONSUMPTION, vipInfo.getCompanyId()); if (cardPayAmount != null && cardPayAmount.compareTo(BigDecimal.ZERO) > 0 && StringUtils.isNotBlank(principalBalanceConsumption.getParamValue())) { BigDecimal scoreSetting0 = new BigDecimal(principalBalanceConsumption.getParamValue()); if (scoreSetting0.compareTo(BigDecimal.ZERO) > 0) { cardScore[0] = cardPayAmount.divide(scoreSetting0).intValue(); } if (StringUtils.isNotBlank(principalBalanceConsumption.getParamValue1())) { BigDecimal scoreSetting1 = new BigDecimal(principalBalanceConsumption.getParamValue1()); if (scoreSetting1.compareTo(BigDecimal.ZERO) > 0) { cardScore[1] = cardPayAmount.divide(scoreSetting1).intValue(); } } if (StringUtils.isNotBlank(principalBalanceConsumption.getParamValue2())) { BigDecimal scoreSetting2 = new BigDecimal(principalBalanceConsumption.getParamValue2()); if (scoreSetting2.compareTo(BigDecimal.ZERO) > 0) { cardScore[2] = cardPayAmount.divide(scoreSetting2).intValue(); } } } int[] giftScore = {0, 0, 0}; //储值卡本赠送付金额 BigDecimal giftPayAmount = flows.stream() .filter(item -> item.getPayMethod().equals("储值卡") && item.getIsGift().equals("Y")) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BusParameterSettings bonusBalanceConsumption = busParameterSettingsDao.selectCompanyParamByCode(ScoreSettingConstant.BONUS_BALANCE_CONSUMPTION, vipInfo.getCompanyId()); if (giftPayAmount != null && giftPayAmount.compareTo(BigDecimal.ZERO) > 0 && StringUtils.isNotBlank(bonusBalanceConsumption.getParamValue())) { BigDecimal scoreSetting0 = new BigDecimal(bonusBalanceConsumption.getParamValue()); if (scoreSetting0.compareTo(BigDecimal.ZERO) > 0) { giftScore[0] = giftPayAmount.divide(scoreSetting0).intValue(); } if (StringUtils.isNotBlank(bonusBalanceConsumption.getParamValue1())) { BigDecimal scoreSetting1 = new BigDecimal(bonusBalanceConsumption.getParamValue1()); if (scoreSetting1.compareTo(BigDecimal.ZERO) > 0) { giftScore[1] = giftPayAmount.divide(scoreSetting1).intValue(); } } if (StringUtils.isNotBlank(bonusBalanceConsumption.getParamValue2())) { BigDecimal scoreSetting2 = new BigDecimal(bonusBalanceConsumption.getParamValue2()); if (scoreSetting2.compareTo(BigDecimal.ZERO) > 0) { giftScore[2] = giftPayAmount.divide(scoreSetting2).intValue(); } } } int selfScore = cashScore[0] + cardScore[0] + giftScore[0]; int parentScore = cashScore[1] + cardScore[1] + giftScore[1]; int topParentScore = cashScore[2] + cardScore[2] + giftScore[2]; //添加自己的积分 if (selfScore > 0) { scoreVipDetailService.addScore( vipInfo.getId(), pageOrder.getStaffId(), pageOrder.getShopId(), selfScore, pageOrder.getId(), ScoreVipDetail.SCORE_VIP_TYPE_CASH, "消费奖励" ); } if (vipInfo.getRecommendId() != null) { //推荐注册老带新积分奖励 SysVipInfo referrerVip = sysVipInfoDao.selectById(vipInfo.getRecommendId()); if (parentScore > 0) { scoreVipDetailService.addScore( referrerVip.getId(), pageOrder.getStaffId(), pageOrder.getShopId(), parentScore, pageOrder.getId(), ScoreVipDetail.SCORE_VIP_TYPE_CASH, "推荐消费奖励" ); } //推荐注册二级带新积分奖励 if (referrerVip.getRecommendId() != null) { SysVipInfo topVipInfo = sysVipInfoDao.selectById(referrerVip.getRecommendId()); if (topParentScore > 0) { scoreVipDetailService.addScore( topVipInfo.getId(), pageOrder.getStaffId(), pageOrder.getShopId(), topParentScore, pageOrder.getId(), ScoreVipDetail.SCORE_VIP_TYPE_CASH, "推荐消费奖励" ); } } } } /** * 创建订单信息 * * @param sysOrder * @return */ @Transactional(rollbackFor = Exception.class) public SysOrder saveOrder(SysOrder sysOrder) { //校验参数 jyytodo // 计算订单折扣金额,收款情况下 计算订单总额 double zkTotal = 0.0; // 页面的pageOrder 参数只包含支付金额信息,不带有购买商品 for (SysOrderItem item : sysOrder.getItems()) { ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(item.getGoodsId()); item.setType(shoppingGoods.getGoodType()); if (item.getZkPrice() == 0) { item.setIsFree(Dictionary.FLAG_YES); } Double itemZkTotal = MoneyUtil.mul(item.getZkPrice(), Double.valueOf(item.getCount())); zkTotal = MoneyUtil.add(zkTotal, itemZkTotal); item.setStatus(Dictionary.ORDER_STATU_DFK); item.setRefundCount(0); } SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); sysOrder.setZkTotal(zkTotal); sysOrder.setStatu(Dictionary.ORDER_STATU_DFK); sysOrder.setShopId(user.getShopId()); sysOrder.setStaffId(user.getSuId()); sysOrder.setCompanyId(user.getCompanyId()); sysOrder.setOrderTime(new Date()); sysOrder.setOrderType(SysOrder.ORDER_TYPE_SEAL); //新增订单 sysOrder.setOrderNo(codeService.getOrderCode()); sysOrderDao.insert(sysOrder); //保存单据明细 sysOrder.getItems().forEach(sysOrderItem -> { sysOrderItem.setOrderId(sysOrder.getId()); orderItemDao.insert(sysOrderItem); }); //保存单据日志 operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.CREATE, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId()); return sysOrder; } /** * 修改订单信息 * * @param sysOrder * @return */ @Transactional(rollbackFor = Exception.class) public SysOrder modifyOrder(SysOrder sysOrder) { // 计算订单折扣金额,收款情况下 计算订单总额 double zkTotal = 0.0; for (SysOrderItem item : sysOrder.getItems()) { ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(item.getGoodsId()); item.setType(shoppingGoods.getGoodType()); if (item.getZkPrice() == 0) { item.setIsFree(Dictionary.FLAG_YES); } Double itemZkTotal = MoneyUtil.mul(item.getZkPrice(), Double.valueOf(item.getCount())); zkTotal = MoneyUtil.add(zkTotal, itemZkTotal); } sysOrder.setZkTotal(zkTotal); //更新订单 sysOrderDao.update(sysOrder); //删除原有订单明细 orderItemDao.deleteByOrderId(sysOrder.getId()); sysOrder.getItems().forEach(sysOrderItem -> { sysOrderItem.setOrderId(sysOrder.getId()); orderItemDao.insert(sysOrderItem); }); SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); //保存单据日志 operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.UPDATE, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId()); return sysOrder; } /** * 创建充值订单 * @param czVo * @return */ public SysOrder createCzOrder(CzXkVo czVo){ MoneyCardUse cardUser = moneyCardUseDao.selectVipCard(czVo.getVipId()); SysOrder order= new SysOrder(); order.setFlows(czVo.getFlows()); order.setVipId(czVo.getVipId()); order.setRemark(cardUser.getCardName()); SysOrderItem orderItem = new SysOrderItem(); ShoppingGoods shoppingGoods = shoppingGoodsDao.selectVipCzGoods(); orderItem.setGoodsId(shoppingGoods.getId()); orderItem.setType(Dictionary.SHOPPING_GOODS_TYPE_CZK); orderItem.setCount(1); orderItem.setIsFree(Dictionary.FLAG_NO); orderItem.setZkPrice(czVo.getBjmoney()); orderItem.setAchieveList(czVo.getAchaeveList()); order.setItems(Arrays.asList(orderItem)); saveOrder(order); return order; } /** * 创建退款订单 * @return */ public SysOrder createTkOrder(SysOrder sysOrder){ SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); //原订单设置为退款状态 SysOrder sourceOrder = new SysOrder(); sourceOrder.setId(sysOrder.getOldOrderId()); sourceOrder.setIsHasRefund(SysOrder.IS_HAS_REFUND_Y); sysOrderDao.update(sourceOrder); sysOrder.setId(null); sysOrder.setStaffId(user.getSuId()); sysOrder.setCompanyId(user.getCompanyId()); sysOrder.setShopId(user.getShopId()); sysOrder.setOrderType(SysOrder.ORDER_TYPE_REFUND); sysOrder.setStatu(Dictionary.ORDER_STATU_YFK); Date now = new Date(); sysOrder.setOrderTime(now); sysOrder.setPayTime(now); sysOrder.setOrderNo(codeService.getRefundOrderNo()); sysOrder.setZkTotal(-sysOrder.getZkTotal()); double cardPayTotal = 0D; double cashPayTotal = 0D; for (SysOrderFlow flow : sysOrder.getFlows()) { // 若使用储值卡付款 if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) { cardPayTotal += flow.getAmount().doubleValue(); } else { cashPayTotal += flow.getAmount().doubleValue(); } } sysOrder.setCardPay(0-( sourceOrder.getCardPay() == null ? 0 : sourceOrder.getCardPay() + cardPayTotal)); sysOrder.setCashPay(0-(sourceOrder.getCashPay() == null ? 0 : sourceOrder.getCashPay() + cashPayTotal)); //新增订单 sysOrderDao.insert(sysOrder); //插入明细 for (SysOrderItem item : sysOrder.getItems()) { //更新原订单明细的可退数量 SysOrderItem oldItem = orderItemDao.selectById(item.getId()); if((oldItem.getRefundCount()+item.getCount()) <= oldItem.getCount()){ oldItem.setRefundCount(oldItem.getRefundCount()+item.getCount()); orderItemDao.update(oldItem); }else{ throw new GlobleException("退款数量大于购买数量"); } //插入新的订单明细 item.setCount(-item.getCount()); item.setZkPrice(-item.getZkPrice()); item.setOrderId(sysOrder.getId()); orderItemDao.insert(item); } LogUtil.info("创建退款订单:{} " , JSON.toJSONString(sysOrder) ) ; return sysOrder; } /** * 退款入库 */ public void refundInstore(@NotEmpty List<SysOrderItem> items) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysSupplierInfo supplierInfo = new SysSupplierInfo(); supplierInfo.setShopId(user.getShopId()); supplierInfo = sysSupplierInfoDao.selectByModel(supplierInfo).get(0); Warehouse warehouse = warehouseDao.findShopWarehouse(user.getShopId()).get(0); SysInstoreInfo instoreInfo = new SysInstoreInfo(); instoreInfo.setInstoreType(SysInstoreInfo.INSTORE_TYPE_RETURN); instoreInfo.setInstoreDate(new Date()); instoreInfo.setSupplierId(supplierInfo.getId().toString()); instoreInfo.setStoreId(warehouse.getId()); instoreInfo.setShopId(user.getShopId()); instoreInfo.setCompanyId(user.getCompanyId()); Double total = 0.0; List<SysInstoreDetail> instoreDetails = new ArrayList<>(); for (SysOrderItem item : items) { ShoppingGoods goods = shoppingGoodsDao.selectById(item.getGoodsId()); SysInstoreDetail sysInstoreDetail = new SysInstoreDetail(); sysInstoreDetail.setAmount(item.getCount().doubleValue()); sysInstoreDetail.setPrice(item.getZkPrice()); sysInstoreDetail.setSkuId(goods.getId()); total = MoneyUtil.add(MoneyUtil.mul(Double.parseDouble(sysInstoreDetail.getAmount() + ""), sysInstoreDetail.getPrice()), total); sysInstoreDetail.setInstoreId(instoreInfo.getId()); // 设置小计 sysInstoreDetail.setPriceTotal(MoneyUtil.mul(Double.parseDouble(sysInstoreDetail.getAmount() + ""), sysInstoreDetail.getPrice())); instoreDetails.add(sysInstoreDetail); } instoreInfo.setInstoreDetails(instoreDetails); instoreInfo.setSumall(total); sysInstoreInfoService.add(instoreInfo); //自动审核单据 sysInstoreInfoService.check(instoreInfo); } } zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
@@ -1,7 +1,9 @@ package com.matrix.system.hive.service.imp; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; import com.matrix.component.asyncmessage.AsyncMessageManager; import com.matrix.core.constance.MatrixConstance; @@ -9,10 +11,8 @@ import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.DateUtil; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.StringUtils; import com.matrix.core.tools.WebUtil; import com.matrix.system.app.dto.OrderListDto; import com.matrix.system.app.mapper.SysProjUseMapper; import com.matrix.system.app.vo.OrderDetailAchieveItemVo; import com.matrix.system.app.vo.OrderDetailItemVo; import com.matrix.system.app.vo.OrderDetailVo; @@ -24,29 +24,23 @@ import com.matrix.system.common.dao.SysUsersDao; import com.matrix.system.common.service.OperationLogService; import com.matrix.system.constance.Dictionary; import com.matrix.system.enums.BooleanEnum; import com.matrix.system.enums.OperationButtonEnum; import com.matrix.system.enums.OperationFunctionEnum; import com.matrix.system.hive.bean.*; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.dto.GoodsSealLimitDto; import com.matrix.system.hive.dto.OrderItemDto; import com.matrix.system.hive.dto.*; import com.matrix.system.hive.plugin.util.CollectionUtils; import com.matrix.system.hive.plugin.util.MoneyUtil; import com.matrix.system.hive.pojo.CzXkVo; import com.matrix.system.hive.pojo.ShoppingCarItem; import com.matrix.system.hive.pojo.ShoppingCarItemsVo; import com.matrix.system.hive.service.*; import com.matrix.system.score.constant.ScoreSettingConstant; import com.matrix.system.score.entity.ScoreVipDetail; import com.matrix.system.score.service.ScoreVipDetailService; import com.matrix.system.shopXcx.mqTask.AsyncMessageRouting; import com.matrix.system.wechart.templateMsg.UniformMsgParam; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpSession; import javax.validation.constraints.NotEmpty; import java.math.BigDecimal; import java.util.*; @@ -62,15 +56,12 @@ @Autowired private SysOrderItemDao orderItemDao; @Autowired private SysProjUseDao sysProjUseDao; @Autowired private SysStoreInfoDao storeInfoDao; @Autowired private CodeService codeService; private SysProjUseService sysProjUseService; @Autowired SysVipInfoDao sysVipInfoDao; @Autowired SysOutStoreDao sysOutStoreDao; SysOutStoreService sysOutStoreService; @Autowired SysOutStoreItemDao sysOutStoreItemDao; @Autowired @@ -106,26 +97,12 @@ @Autowired private AchieveNewDao achieveNewDao; @Autowired private WarehouseDao warehouseDao; @Autowired private ShoppingGoodsService shoppingGoodsService; @Autowired private SysOrderFlowDao sysOrderFlowDao; @Autowired private SysSupplierInfoDao sysSupplierInfoDao; @Autowired private SysInstoreInfoDao sysInstoreInfoDao; @Autowired private SysInstoreDetailDao sysInstoreDetailDao; @Autowired private SysInstoreInfoService sysInstoreInfoService; @Autowired BusParameterSettingsDao parameterSettingsDao; @@ -135,6 +112,542 @@ @Autowired private OperationLogService operationLogService; @Autowired private SysVipInfoService sysVipInfoService; @Autowired private SysOrderServiceHelper sysOrderServiceHelper; @Autowired MoneyCardUseService moneyCardUseService; //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓业务代码区↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ @Override @Transactional(rollbackFor = Exception.class) public SysOrder checkAndSaveOrder(SysOrder sysOrder) { if (Objects.isNull(sysOrder.getId())) { LogUtil.info("新增正向订单"); return sysOrderServiceHelper.saveOrder(sysOrder); } else { LogUtil.info("修改订单"); return sysOrderServiceHelper.modifyOrder(sysOrder); } } /** * 取消订单 * * @param id * @return */ @Override @Transactional(rollbackFor = Exception.class) public void cancelOrder(Long id) { SysOrder order = sysOrderDao.selectById(id); if (order.getStatu().equals(Dictionary.ORDER_STATU_DFK)) { //待付款订单取消 cancelDFKOrder(order); } else { //已付款订单取消 cancelYFKOrder(order); } } /** * 已付款订单取消 * * @param order */ private void cancelYFKOrder(SysOrder order) { SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); //一个订单只能被取消一次 if (Dictionary.ORDER_STATU_YQX.equals(order.getStatu())) { throw new GlobleException("订单已取消"); } //储值卡退款 sysOrderServiceHelper.returnMoneyCardPay(order); //套餐项目取消 List<SysOrderItem> sysOrderItems = orderItemDao.selectByOrderId(order.getId()); for (SysOrderItem orderItem : sysOrderItems) { // 充值卡类型退款 if (Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(orderItem.getType())) { //删除购买的充值卡 moneyCardUseService.deleteByOrderItemId(orderItem.getId()); } else if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(orderItem.getType()) || Dictionary.SHOPPING_GOODS_TYPE_TC.equals(orderItem.getType())) { // 项目套餐退款 // 删除套餐项目使用情况 sysProjUseService.deleteByOrderItemId(orderItem.getId()); } } //删除出库单,恢复库存 SysOutStore sysOutStore = new SysOutStore(); sysOutStore.setOrderId(order.getId()); List<SysOutStore> sysOutStores = sysOutStoreService.findByModel(sysOutStore); if (sysOutStores.size() == 1) { sysOutStore = sysOutStores.get(0); sysOutStoreService.cancelOutStore(sysOutStore.getId()); } // 删除业绩 achieveNewService.removeByOrderId(order.getId()); // 删除收款记录 sysOrderFlowDao.deleteByOrderId(order.getId()); //删除积分 scoreVipDetailService.removeByBusinessId(order.getVipId(), order.getId()); // 取消订单 order.setStatu(Dictionary.ORDER_STATU_YQX); sysOrderDao.update(order); //保存单据日志 operationLogService.saveOperation(order.getCompanyId(), order.getShopId(), sysUsers.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.CANCEL, order.getId(), order.getOrderNo(), order.getVipId(), "已付款取消订单"); } /** * 待付款订单取消 * * @param order */ private void cancelDFKOrder(SysOrder order) { SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); order.setStatu(Dictionary.ORDER_STATU_YQX); order.setArrears(0D); //发送微信公众号提醒 UniformMsgParam uniformMsgParam = new UniformMsgParam(order.getCompanyId(), UniformMsgParam.GZH_DDQX); uniformMsgParam.put("orderId", order.getId()); asyncMessageManager.sendMsg(AsyncMessageRouting.SEND_UNIFORM_TEMPLATE_MSG, uniformMsgParam); sysOrderDao.update(order); //保存单据日志 operationLogService.saveOperation(order.getCompanyId(), order.getShopId(), sysUsers.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.CANCEL, order.getId(), order.getOrderNo(), order.getVipId(), "未付款取消订单"); } /** * jyy 收款 */ @Override @Transactional(rollbackFor = Exception.class) public void payOrder(SysOrder pageOrder) throws GlobleException { //校验订单是否满足收款条件 checkOrderAblePay(pageOrder); // 更新订单主表信息 payEndUpdateOrderInfo(pageOrder); //添加支付流水 sysOrderServiceHelper.addOrderFlow(pageOrder, false); //扣除储值卡余额 sysOrderServiceHelper.cardPaySk(pageOrder); // 设置会员充值卡使用情况 sysOrderServiceHelper.addMoneyCardUse(pageOrder); // 改变客户项目套餐使用情况 sysOrderServiceHelper.addTaocanProj(pageOrder); // 新增出库单 sysOrderServiceHelper.addOutStore(pageOrder); // 设置业绩 achieveNewService.addAchaeveByOrder(pageOrder); //设置会员积分 sysOrderServiceHelper.addVipScore(pageOrder); //保存订单收款日志 saveOrderSkLog(pageOrder); } /** * 保存订单收款日志 * * @param pageOrder */ private void saveOrderSkLog(SysOrder pageOrder) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); operationLogService.saveOperation(pageOrder.getCompanyId(), pageOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.ORDER_SK, pageOrder.getId(), pageOrder.getOrderNo(), pageOrder.getVipId()); } /** * 付款后更新订单信息 * * @param pageOrder */ private void payEndUpdateOrderInfo(SysOrder pageOrder) { LogUtil.info("付款更新订单信息 id={}", pageOrder.getId()); SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); pageOrder.setCashierId(user.getSuId()); pageOrder.setPayTime(new Date()); pageOrder.setStatu(Dictionary.ORDER_STATU_YFK); List<SysOrderFlow> flows = pageOrder.getFlows(); BigDecimal cashPayAmount = flows.stream() .filter(item -> (!item.getPayMethod().equals("储值卡")) && (!item.getPayMethod().equals("欠款"))) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal cardPayAmount = flows.stream() .filter(item -> item.getPayMethod().equals("储值卡")) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); pageOrder.setCardPay(cardPayAmount.doubleValue()); pageOrder.setCashPay(cashPayAmount.doubleValue()); for (SysOrderFlow flow : pageOrder.getFlows()) { //欠款处理 if (SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())) { pageOrder.setStatu(Dictionary.ORDER_STATU_QK); pageOrder.setArrears(flow.getAmount().doubleValue()); } } double sum = flows.stream().mapToDouble(item -> item.getAmount().doubleValue()).sum(); if (sum > 0 && cardPayAmount.doubleValue() == 0 && cashPayAmount.doubleValue() == 0) { throw new GlobleException("订单更新失败,支付金额计算错误,请联系管理员"); } sysOrderDao.update(pageOrder); // 设置用户为成交客户 sysVipInfoService.updateDealStatus(pageOrder.getVipId(), BooleanEnum.TRUE.getValue()); } /** * 检查订单是否满足支付条件 * * @param pageOrder */ private void checkOrderAblePay(SysOrder pageOrder) { SysOrder checkOrder = sysOrderDao.selectById(pageOrder.getId()); //状态校验 if (!Dictionary.ORDER_STATU_DFK.equals(checkOrder.getStatu())) { throw new GlobleException("该订单已经收过款,请刷新页面再试!"); } //检查交易限制调整 GoodsSealLimitDto goodsSealLimitDto = new GoodsSealLimitDto(); goodsSealLimitDto.setVipId(pageOrder.getVipId()); goodsSealLimitDto.setSysOrderItemDtoList(Lists.newArrayList()); pageOrder.getItems().forEach(e -> { goodsSealLimitDto.getSysOrderItemDtoList().add(BeanUtil.copyProperties(e, SysOrderItemDto.class)); }); shoppingGoodsService.checkGoodsSealLimit(goodsSealLimitDto); //检查业绩设置 checkOrderAchieve(pageOrder); LogUtil.info("订单满足支付条件 id={}", pageOrder.getId()); } /** * 检查业绩设置是否合理 * 1、每个订单明细都要有至少一个对应的业绩 * 2、每个订单明细的同类型业绩金额之和不能大于明细支付金额 * * @param pageOrder */ private void checkOrderAchieve(SysOrder pageOrder) { pageOrder.getItems().forEach(item -> { if (CollectionUtil.isEmpty(item.getAchieveList())) { ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId()); throw GlobleException.instance(shopGoods.getName() + "缺少设置业绩"); } //按业绩类型分组后比较支付金额与业绩金额是否相等 Map<String, List<AchieveNew>> achieveTypeMap = item.getAchieveList().stream().collect(Collectors.groupingBy(AchieveNew::getAchieveType)); Set<Map.Entry<String, List<AchieveNew>>> entries = achieveTypeMap.entrySet(); entries.forEach(entrie -> { double sum = entrie.getValue().stream().mapToDouble(AchieveNew::getGoodsCash).sum(); //todo 目前使用js计算金额可能存在精度的误差展示用0.1屏蔽 if (Math.abs(sum - (item.getZkPrice() * item.getCount())) > 0.1) { ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId()); throw GlobleException.instance(shopGoods.getName() + "," + entrie.getKey() + "业绩金额与收款金额不一致"); } }); }); } /** * 补交 * * @author:姜友瑶 * @date 2016年9月19日 */ @Transactional(rollbackFor = Exception.class) @Override public void updateAfterMoney(SysOrder pageOrder) { SysOrder sourceOrder = sysOrderDao.selectById(pageOrder.getId()); //添加支付流水 sysOrderServiceHelper.addOrderFlow(pageOrder, true); //扣除储值卡余额 sysOrderServiceHelper.cardPaySk(pageOrder); double refundTotal = 0D; double cardPayTotal = 0D; double cashPayTotal = 0D; for (SysOrderFlow flow : pageOrder.getFlows()) { // 若使用储值卡付款 if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) { cardPayTotal += flow.getAmount().doubleValue(); } else { cashPayTotal += flow.getAmount().doubleValue(); } refundTotal += flow.getAmount().doubleValue(); } if (refundTotal == pageOrder.getArrears()) { sourceOrder.setStatu(Dictionary.ORDER_STATU_YFK); } 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); sysOrderDao.update(sourceOrder); } /** * 会员卡充值 * * @param czVo */ @Override @Transactional(rollbackFor = Exception.class) public SysOrder moneyCardCz(CzXkVo czVo) { // 新增一个充值订单 SysOrder order = sysOrderServiceHelper.createCzOrder(czVo); //新增会员卡金额 MoneyCardUse cardUser = moneyCardUseDao.selectVipCard(czVo.getVipId()); MoneyCardOperationDto moneyCardOperationDto = new MoneyCardOperationDto(); moneyCardOperationDto.setRealMoney(czVo.getBjmoney()); moneyCardOperationDto.setGiftMoney(czVo.getGiftMoney()); moneyCardOperationDto.setCarUseId(cardUser.getId()); moneyCardOperationDto.setOrderId(order.getId()); moneyCardOperationDto.setOrderNo(order.getOrderNo()); moneyCardOperationDto.setType(MoneyCardUseFlow.USE_TYPE_CZ); SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); moneyCardOperationDto.setUpdateUser(user.getSuId()); moneyCardUseService.changeMoneyCard(Arrays.asList(moneyCardOperationDto)); // 更新订单主表信息 payEndUpdateOrderInfo(order); //添加支付流水 sysOrderServiceHelper.addOrderFlow(order, false); // 设置业绩 achieveNewService.addAchaeveByOrder(order); //设置会员积分 sysOrderServiceHelper.addVipScore(order); return order; } @Override public SysOrder findSysOrderTjByVipId(Long vipId) { return sysOrderDao.selectVipOrderInfoTotal(vipId); } @Override public List<OrderDetailVo> findApiOrderListInPage(OrderListDto orderListDto, PaginationVO pageVo) { return sysOrderDao.selectApiOrderListInPage(orderListDto, pageVo); } @Override public int findApiOrderListTotal(OrderListDto orderListDto) { return sysOrderDao.selectApiOrderListTotal(orderListDto); } @Override public OrderDetailVo findApiOrderDetailByOrderId(Long orderId) { OrderDetailVo orderDetail = sysOrderDao.selectApiOrderDetailById(orderId); if (orderDetail == null) { throw new GlobleException("该订单不存在"); } List<OrderDetailItemVo> items = orderItemDao.selectApiOrderDetailItemsByOrderId(orderId); if (CollectionUtils.isNotEmpty(items)) { for (OrderDetailItemVo item : items) { List<OrderDetailAchieveItemVo> achieveItems = achieveNewDao.selectApiOrderItemAchieve(item.getId()); item.setAchieves(achieveItems); } } orderDetail.setItems(items); return orderDetail; } @Override public List<RankingVo> findApiShopAchieveRanking(SysOrder sysOrder) { return sysOrderDao.selectShopAchieveRanking(sysOrder); } @Transactional(rollbackFor = Exception.class) @Override public void orderTk(SysOrder sysOrder) { //创建并保存退款订单 sysOrder = sysOrderServiceHelper.createTkOrder(sysOrder); // 添加订单收款流水 sysOrderServiceHelper.addOrderFlow(sysOrder, false); //退款退套餐退项目 refundProjUse(sysOrder); //删除积分 SysOrder oldOrder = sysOrderDao.selectById(sysOrder.getOldOrderId()); scoreVipDetailService.removeByBusinessId(oldOrder.getVipId(), oldOrder.getId()); // 设置业绩 achieveNewService.addAchaeveByOrder(sysOrder); SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); //保存单据日志 operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.ORDER_TK, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId()); } /** * 退款退项目,套餐,卡项 * * @param sysOrder */ private void refundProjUse(SysOrder sysOrder) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); //记录需要退库存的产品 List<SysOrderItem> returnGoodsList = new ArrayList<>(); //需要退的套餐和项目 List<ProjUseOperationDto> projUseDtoList = Lists.newArrayList(); //需要退的储值卡 List<MoneyCardOperationDto> moneyCardOperationDtos = Lists.newArrayList(); for (SysOrderItem item : sysOrder.getItems()) { if (Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(item.getType()) && Dictionary.FLAG_YES_Y.equals(item.getIsReturnStore())) { returnGoodsList.add(item); } else if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(item.getType()) || Dictionary.SHOPPING_GOODS_TYPE_XM.equals(item.getType())) { ProjUseOperationDto dto = new ProjUseOperationDto(); dto.setGoodsId(item.getGoodsId()); dto.setCount(item.getRefundCount()); dto.setOrderItemId(item.getOldItemId()); dto.setUpdateUserId(user.getSuId()); projUseDtoList.add(dto); }else if (Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(item.getType())) { MoneyCardOperationDto moneyCardOperationDto = new MoneyCardOperationDto(); moneyCardOperationDto.setOrderId(sysOrder.getId()); moneyCardOperationDto.setOrderNo(sysOrder.getOrderNo()); moneyCardOperationDto.setOrderItemId(item.getOldItemId()); moneyCardOperationDto.setType(MoneyCardUseFlow.USE_TYPE_ORDRE_TK); moneyCardOperationDto.setUpdateUser(user.getSuId()); moneyCardOperationDto.setOrderNo(sysOrder.getOrderNo()); moneyCardOperationDto.setRealMoney(item.getZkPrice()); moneyCardOperationDtos.add(moneyCardOperationDto); } } BusParameterSettings manageStockSetting = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WAREHOUSE_MANAGE_STOCK, sysOrder.getCompanyId()); if (AppConstance.IS_Y.equals(manageStockSetting.getParamValue())) { // 家居产品退库存 if (CollectionUtils.isNotEmpty(returnGoodsList)) { LogUtil.info("订单退款:退产品库存:{}", JSON.toJSONString(returnGoodsList)); sysOrderServiceHelper.refundInstore(returnGoodsList); } } if(CollUtil.isNotEmpty(projUseDtoList)){ LogUtil.info("订单退款:退套餐项目:{}", JSON.toJSONString(projUseDtoList)); sysProjUseService.projectTk(projUseDtoList); } if(CollUtil.isNotEmpty(moneyCardOperationDtos)){ LogUtil.info("订单退款:储值卡:{}", JSON.toJSONString(moneyCardOperationDtos)); moneyCardUseService.moneyCardTk(moneyCardOperationDtos); } } @Override public BigDecimal findVipArrearsByVipId(Long vipId) { return sysOrderDao.selectArrearsByVipId(vipId); } //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓===增删改查代码区↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ @Override @@ -190,1728 +703,5 @@ public SysOrder findById(Long id) { return sysOrderDao.selectById(id); } @Override @Transactional(rollbackFor = Exception.class) public SysOrder checkAndSaveOrder(SysOrder sysOrder) { // 计算订单折扣金额,收款情况下 计算订单总额 double zkTotal = 0.0; // 判断是否为退款 String orderStatus = Dictionary.ORDER_STATU_DFK; if (Dictionary.ORDER_STATU_TK.equals(sysOrder.getStatu())) { orderStatus = Dictionary.ORDER_STATU_TK; } // 页面的pageOrder 参数只包含支付金额信息,不带有购买商品 for (SysOrderItem item : sysOrder.getItems()) { // 若为退款,则先更新原有数量 if (orderStatus.equals(Dictionary.ORDER_STATU_TK)) { SysOrderItem sysOrderItem = new SysOrderItem(); sysOrderItem.setId(item.getId()); sysOrderItem.setCount(item.getPreCount() - item.getCount()); orderItemDao.update(sysOrderItem); } item.setId(null); ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(item.getGoodsId()); item.setType(shoppingGoods.getGoodType()); if (item.getZkPrice() == 0) { item.setIsFree(Dictionary.FLAG_YES); } // 订单欠款减去支付金额 设置实际欠款 Double itemZkTotal = MoneyUtil.mul(item.getZkPrice(), Double.valueOf(item.getCount())); zkTotal = MoneyUtil.add(zkTotal, itemZkTotal); item.setStatus(orderStatus); } SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); sysOrder.setZkTotal(zkTotal); sysOrder.setStatu(orderStatus); SysOrder source = null; if (sysOrder.getId() != null) { source = sysOrderDao.selectById(sysOrder.getId()); } sysOrder.setStaffId(source != null ? source.getStaffId() : user.getSuId()); sysOrder.setCompanyId(source != null ? source.getCompanyId() : user.getCompanyId()); if (sysOrder.getId() == null) { //新增订单 sysOrder.setOrderNo(codeService.getOrderCode()); sysOrderDao.insert(sysOrder); //保存单据日志 operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.CREATE, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId()); } else { //更新订单 sysOrderDao.update(sysOrder); //删除原有订单明细 orderItemDao.deleteByOrderId(sysOrder.getId()); //保存单据日志 operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.UPDATE, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId(), "修改订单内容"); } sysOrder.getItems().forEach(sysOrderItem -> { sysOrderItem.setOrderId(sysOrder.getId()); if (sysOrder.getStatu().equals(Dictionary.ORDER_STATU_TK)) { // 取负数 sysOrderItem.setCount(-sysOrderItem.getCount()); orderItemDao.insert(sysOrderItem); // 调整回来 sysOrderItem.setCount(-sysOrderItem.getCount()); } else { orderItemDao.insert(sysOrderItem); } }); return sysOrder; } /** * 取消订单 * * @param id * @return */ @Override @Transactional(rollbackFor = Exception.class) public void cancelOrder(Long id) { SysOrder order = sysOrderDao.selectById(id); SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); if (order.getStatu().equals(Dictionary.ORDER_STATU_DFK)) { order.setStatu(Dictionary.ORDER_STATU_YQX); order.setArrears(0D); //发送微信公众号提醒 UniformMsgParam uniformMsgParam = new UniformMsgParam(order.getCompanyId(), UniformMsgParam.GZH_DDQX); uniformMsgParam.put("orderId", order.getId()); asyncMessageManager.sendMsg(AsyncMessageRouting.SEND_UNIFORM_TEMPLATE_MSG, uniformMsgParam); sysOrderDao.update(order); //保存单据日志 operationLogService.saveOperation(order.getCompanyId(), order.getShopId(),sysUsers.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.CANCEL, order.getId(), order.getOrderNo(), order.getVipId(), "未付款取消订单"); } else { //一个订单只能被取消一次 if (Dictionary.ORDER_STATU_YQX.equals(order.getStatu())) { throw new GlobleException("订单已取消"); } List<SysOrderFlow> flows = sysOrderFlowDao.selectByOrderId(id); // 非现金收款退回扣卡余额 for (SysOrderFlow flow : flows) { if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) { MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(flow.getCardId()); MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow(); if (moneyCardUse != null) { // 根据订单明细判断是赠送金额购买还是本金购买 moneyCardUseFlow.setTotal(flow.getAmount().doubleValue()); if (SysOrderFlow.IS_GIFT_Y.equals(flow.getIsGift())) { moneyCardUse.setGiftMoney(MoneyUtil.add(moneyCardUse.getGiftMoney(), flow.getAmount().doubleValue())); } else { moneyCardUse.setRealMoney(MoneyUtil.add(moneyCardUse.getRealMoney(), flow.getAmount().doubleValue())); } if (!moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)) { if (moneyCardUse.getLastCount() != null) { moneyCardUse.setLastCount(moneyCardUse.getLastCount() + 1); moneyCardUseFlow.setTimes(1); } } moneyCardUseDao.update(moneyCardUse); //插入充值卡变动流水 SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); moneyCardUseFlow.setOrderNo(order.getOrderNo()); moneyCardUseFlow.setCarUseId(moneyCardUse.getId()); moneyCardUseFlow.setVipId(order.getVipId()); moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_ORDRE_CANCEL); moneyCardUseFlow.setCreateTime(new Date()); moneyCardUseFlow.setOperationId(user.getSuId()); moneyCardUseFlow.setContent(moneyCardUse.getChangeRemark()); moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney()); moneyCardUseFlowDao.insert(moneyCardUseFlow); } } } List<SysOrderItem> sysOrderItems = orderItemDao.selectByOrderId(id); for (SysOrderItem orderItem : sysOrderItems) { // 充值卡类型退款 if (Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(orderItem.getType())) { ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(orderItem.getGoodsId()); //删除购买的充值卡 moneyCardUseDao.deleteByOrderItemId(orderItem.getId()); } else if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(orderItem.getType()) || Dictionary.SHOPPING_GOODS_TYPE_TC.equals(orderItem.getType())) { // 项目套餐退款 // 删除套餐项目使用情况 sysProjUseDao.deleteByOrderItemId(orderItem.getId()); } else if (Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(orderItem.getType())) { // 综合卡 // 删除套餐项目使用情况 sysProjUseDao.deleteByOrderItemId(orderItem.getId()); // 删除充值卡 moneyCardUseDao.deleteByOrderItemId(orderItem.getId()); } } //删除出库单,恢复库存 SysOutStore sysOutStore = new SysOutStore(); sysOutStore.setOrderId(order.getId()); List<SysOutStore> sysOutStores = sysOutStoreDao.selectByModel(sysOutStore); if (sysOutStores.size() == 1) { sysOutStore = sysOutStores.get(0); List<SysOutStoreItem> outStoreItemList = sysOutStoreItemDao.selectByOrderId(sysOutStore.getId()); for (SysOutStoreItem item : outStoreItemList) { SysStoreInfo sysStoreInfo = storeInfoDao.selectById(item.getStoreId()); sysStoreInfo.setStoreTotal(sysStoreInfo.getStoreTotal() + item.getAmount()); //更新库存 storeInfoDao.update(sysStoreInfo); } sysOutStoreDao.deleteById(sysOutStore.getId()); sysOutStoreItemDao.deleteByOrderId(sysOutStore.getId()); } // 删除业绩 AchieveNew achieveNew = new AchieveNew(); achieveNew.setOrderId(id); achieveNewService.removeByModel(achieveNew); // 删除收款记录 sysOrderFlowDao.deleteByOrderId(id); //删除积分 scoreVipDetailService.removeByBusinessId(order.getVipId(), order.getId()); // 取消订单 order.setStatu(Dictionary.ORDER_STATU_YQX); sysOrderDao.update(order); //保存单据日志 operationLogService.saveOperation(order.getCompanyId(), order.getShopId(),sysUsers.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.CANCEL, order.getId(), order.getOrderNo(), order.getVipId(), "已付款取消订单"); } } /** * 创建订单 lk */ @Override @Transactional(rollbackFor = Exception.class) public int createOrder(HttpSession session, ShoppingCarItemsVo car) { if (car.getCarItems().size() < 1) { throw new GlobleException("没用选择购买产品"); } // 获取会员信息,判断等级 获取相应家居折扣 SysVipInfo info = sysVipInfoDao.selectById(car.getVipId()); //获取折扣----- Double zk = zk = 1.0; SysOrder order = new SysOrder(); SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); order.setShopId(user.getShopId()); order.setOrderNo(codeService.getOrderCode()); order.setVipId(info.getId()); order.setOrderTime(new Date()); order.setRemark(car.getRemark()); order.setStaffId(user.getSuId()); order.setIsCross(2 + ""); order.setChangeId(car.getChangeId()); order.setStatu(Dictionary.ORDER_STATU_DFK); order.setCardPay(0.00); order.setCashPay(0.00); order.setCompanyId(user.getCompanyId()); order.setBeatuyId(car.getBeatuyId() + ""); // 根据美疗师id查询美疗师姓名 if (car.getBeatuyId() != null) { String beatuyName = shopStaffInfoDao.selectById(car.getBeatuyId()).getSuName(); System.out.println("美疗师:" + beatuyName); order.setBeatuyName(beatuyName); } int i = sysOrderDao.insert(order); // 创建订单明细,并计算总价与折扣总价 // 总价 double total = 0; double zkTotal = 0; int count = 0; // 设置订单条目 for (ShoppingCarItem carItem : car.getCarItems()) { SysOrderItem orderItem = new SysOrderItem(); orderItem.setOrderId(order.getId()); orderItem.setCount(carItem.getCount()); orderItem.setIsFree(carItem.getIsFree()); orderItem.setType(carItem.getType()); orderItem.setStatus(Dictionary.ORDER_STATU_DFK); // 新增明细 // 设置商品id orderItem.setGoodsId(carItem.getGoodsId()); // 设置assembleId orderItem.setAssembleId(carItem.getAssembleId()); // 如果是家居产品的话,要取出组合sku中的价格 double p = carItem.getShoppingGoods().getSealPice(); orderItem.setPrice(p); if (carItem.getIsFree().equals(Dictionary.FLAG_NO)) { orderItem.setZkPrice(MoneyUtil.mul(p, zk)); } else { // 如果是免费,则设置为0.0 orderItem.setZkPrice(0.0); } orderItemDao.insert(orderItem); total = MoneyUtil.add(total, MoneyUtil.mul(orderItem.getPrice(), Double.parseDouble(carItem.getCount() + ""))); zkTotal = MoneyUtil.add(zkTotal, MoneyUtil.mul(orderItem.getZkPrice(), Double.parseDouble(carItem.getCount() + ""))); } // 设置订单总价与折后价 order.setTotal(total); order.setZkTotal(zkTotal); sysOrderDao.update(order); return i; } /** * jyy 收款 */ @Override @Transactional(rollbackFor = Exception.class) public void updateReceiptMoney(SysOrder pageOrder) throws GlobleException { if (!Dictionary.ORDER_STATU_DFK.equals(pageOrder.getStatu())) { throw new GlobleException("该订单已经收过款,请刷新页面再试!"); } checkOrder(pageOrder); // 更新收款时间 updateOrderInfo(pageOrder); // 获取用户信息 SysVipInfo vipInfo = sysVipInfoDao.selectById(pageOrder.getVipId()); if (SysVipInfo.UNDEAL_VIP == vipInfo.getIsDeal()) { //非成交客户下单更新客户为成交客户 vipInfo.setIsDeal(SysVipInfo.DEAL_VIP); sysVipInfoDao.update(vipInfo); } //添加支付流水 addOrderFlow(pageOrder); // 设置会员充值卡使用情况 addMoneyCardUse(pageOrder); // 改变客户项目套餐使用情况 addTaocanProj(pageOrder); // 新增出库单 addOutStore(pageOrder); // 设置业绩 achieveNewService.addAchaeveByOrder(pageOrder); setShopSelCount(pageOrder); //设置会员积分 addVipScore(pageOrder); } /** * 付款后更新订单信息 * * @param pageOrder */ private void updateOrderInfo(SysOrder pageOrder) { SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); pageOrder.setCashierId(user.getSuId()); pageOrder.setPayTime(new Date()); pageOrder.setStatu(Dictionary.ORDER_STATU_YFK); List<SysOrderFlow> flows = pageOrder.getFlows(); BigDecimal cashPayAmount = flows.stream() .filter(item -> (!item.getPayMethod().equals("储值卡")) && (!item.getPayMethod().equals("欠款"))) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal cardPayAmount = flows.stream() .filter(item -> item.getPayMethod().equals("储值卡")) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); pageOrder.setCardPay(cardPayAmount.doubleValue()); pageOrder.setCashPay(cashPayAmount.doubleValue()); //欠款金额在流水处理中处理了 double sum = flows.stream().mapToDouble(item -> item.getAmount().doubleValue()).sum(); if (sum > 0 && cardPayAmount.doubleValue() == 0 && cashPayAmount.doubleValue() == 0) { throw new GlobleException("订单更新失败,支付金额计算错误,请联系管理员"); } sysOrderDao.update(pageOrder); //保存单据日志 operationLogService.saveOperation(pageOrder.getCompanyId(), pageOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.ORDER_SK, pageOrder.getId(), pageOrder.getOrderNo(), pageOrder.getVipId()); } private void checkOrder(SysOrder pageOrder) { //检查交易限制调整 jyytodo 测试一下 GoodsSealLimitDto goodsSealLimitDto = new GoodsSealLimitDto(); goodsSealLimitDto.setVipId(pageOrder.getVipId()); goodsSealLimitDto.setOrderItemDtoList(Lists.newArrayList()); pageOrder.getItems().forEach(e->{ goodsSealLimitDto.getOrderItemDtoList().add(BeanUtil.copyProperties(e, OrderItemDto.class)); }); shoppingGoodsService.checkGoodsSealLimit(goodsSealLimitDto); //检查业绩设置 checkOrderAchieve(pageOrder); } /** * 检查业绩设置是否合理 * 1、每个订单明细都要有至少一个对应的业绩 * 2、每个订单明细的同类型业绩金额之和不能大于明细支付金额 * * @param pageOrder */ private void checkOrderAchieve(SysOrder pageOrder) { pageOrder.getItems().forEach(item -> { if (CollectionUtil.isEmpty(item.getAchieveList())) { ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId()); throw GlobleException.instance(shopGoods.getName() + "缺少设置业绩"); } //按业绩类型分组后比较支付金额与业绩金额是否相等 Map<String, List<AchieveNew>> achieveTypeMap = item.getAchieveList().stream().collect(Collectors.groupingBy(AchieveNew::getAchieveType)); Set<Map.Entry<String, List<AchieveNew>>> entries = achieveTypeMap.entrySet(); entries.forEach(entrie -> { double sum = entrie.getValue().stream().mapToDouble(AchieveNew::getGoodsCash).sum(); //todo 目前使用js计算金额可能存在精度的误差展示用0.1屏蔽 if (Math.abs(sum - (item.getZkPrice() * item.getCount())) > 0.1) { ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId()); throw GlobleException.instance(shopGoods.getName() + "," + entrie.getKey() + "业绩金额与收款金额不一致"); } }); }); } /** * 设置会员消费积分 * * @param pageOrder */ private void addVipScore(SysOrder pageOrder) { SysVipInfo vipInfo = sysVipInfoDao.selectById(pageOrder.getVipId()); List<SysOrderFlow> flows = pageOrder.getFlows(); int[] cashScore = {0, 0, 0}; //现金支付金额 BigDecimal cashPayAmount = flows.stream() .filter(item -> (!item.getPayMethod().equals("储值卡")) && (!item.getPayMethod().equals("欠款"))) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BusParameterSettings cashConsumption = busParameterSettingsDao.selectCompanyParamByCode(ScoreSettingConstant.CASH_CONSUMPTION, vipInfo.getCompanyId()); if (cashPayAmount != null && cashPayAmount.compareTo(BigDecimal.ZERO) > 0 && StringUtils.isNotBlank(cashConsumption.getParamValue())) { BigDecimal scoreSetting0 = new BigDecimal(cashConsumption.getParamValue()); if (scoreSetting0.compareTo(BigDecimal.ZERO) > 0) { cashScore[0] = cashPayAmount.divide(scoreSetting0).intValue(); } if (StringUtils.isNotBlank(cashConsumption.getParamValue1())) { BigDecimal scoreSetting1 = new BigDecimal(cashConsumption.getParamValue1()); if (scoreSetting1.compareTo(BigDecimal.ZERO) > 0) { cashScore[1] = cashPayAmount.divide(scoreSetting1).intValue(); } } if (StringUtils.isNotBlank(cashConsumption.getParamValue2())) { BigDecimal scoreSetting2 = new BigDecimal(cashConsumption.getParamValue2()); if (scoreSetting2.compareTo(BigDecimal.ZERO) > 0) { cashScore[2] = cashPayAmount.divide(scoreSetting2).intValue(); } } } int[] cardScore = {0, 0, 0}; //储值卡本金支付金额 BigDecimal cardPayAmount = flows.stream() .filter(item -> item.getPayMethod().equals("储值卡") && item.getIsGift().equals("N")) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BusParameterSettings principalBalanceConsumption = busParameterSettingsDao.selectCompanyParamByCode(ScoreSettingConstant.PRINCIPAL_BALANCE_CONSUMPTION, vipInfo.getCompanyId()); if (cardPayAmount != null && cardPayAmount.compareTo(BigDecimal.ZERO) > 0 && StringUtils.isNotBlank(principalBalanceConsumption.getParamValue())) { BigDecimal scoreSetting0 = new BigDecimal(principalBalanceConsumption.getParamValue()); if (scoreSetting0.compareTo(BigDecimal.ZERO) > 0) { cardScore[0] = cardPayAmount.divide(scoreSetting0).intValue(); } if (StringUtils.isNotBlank(principalBalanceConsumption.getParamValue1())) { BigDecimal scoreSetting1 = new BigDecimal(principalBalanceConsumption.getParamValue1()); if (scoreSetting1.compareTo(BigDecimal.ZERO) > 0) { cardScore[1] = cardPayAmount.divide(scoreSetting1).intValue(); } } if (StringUtils.isNotBlank(principalBalanceConsumption.getParamValue2())) { BigDecimal scoreSetting2 = new BigDecimal(principalBalanceConsumption.getParamValue2()); if (scoreSetting2.compareTo(BigDecimal.ZERO) > 0) { cardScore[2] = cardPayAmount.divide(scoreSetting2).intValue(); } } } int[] giftScore = {0, 0, 0}; //储值卡本赠送付金额 BigDecimal giftPayAmount = flows.stream() .filter(item -> item.getPayMethod().equals("储值卡") && item.getIsGift().equals("Y")) .map(SysOrderFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BusParameterSettings bonusBalanceConsumption = busParameterSettingsDao.selectCompanyParamByCode(ScoreSettingConstant.BONUS_BALANCE_CONSUMPTION, vipInfo.getCompanyId()); if (giftPayAmount != null && giftPayAmount.compareTo(BigDecimal.ZERO) > 0 && StringUtils.isNotBlank(bonusBalanceConsumption.getParamValue())) { BigDecimal scoreSetting0 = new BigDecimal(bonusBalanceConsumption.getParamValue()); if (scoreSetting0.compareTo(BigDecimal.ZERO) > 0) { giftScore[0] = giftPayAmount.divide(scoreSetting0).intValue(); } if (StringUtils.isNotBlank(bonusBalanceConsumption.getParamValue1())) { BigDecimal scoreSetting1 = new BigDecimal(bonusBalanceConsumption.getParamValue1()); if (scoreSetting1.compareTo(BigDecimal.ZERO) > 0) { giftScore[1] = giftPayAmount.divide(scoreSetting1).intValue(); } } if (StringUtils.isNotBlank(bonusBalanceConsumption.getParamValue2())) { BigDecimal scoreSetting2 = new BigDecimal(bonusBalanceConsumption.getParamValue2()); if (scoreSetting2.compareTo(BigDecimal.ZERO) > 0) { giftScore[2] = giftPayAmount.divide(scoreSetting2).intValue(); } } } int selfScore = cashScore[0] + cardScore[0] + giftScore[0]; int parentScore = cashScore[1] + cardScore[1] + giftScore[1]; int topParentScore = cashScore[2] + cardScore[2] + giftScore[2]; //添加自己的积分 if (selfScore > 0) { scoreVipDetailService.addScore( vipInfo.getId(), pageOrder.getStaffId(), pageOrder.getShopId(), selfScore, pageOrder.getId(), ScoreVipDetail.SCORE_VIP_TYPE_CASH, "消费奖励" ); } if (vipInfo.getRecommendId() != null) { //推荐注册老带新积分奖励 SysVipInfo referrerVip = sysVipInfoDao.selectById(vipInfo.getRecommendId()); if (parentScore > 0) { scoreVipDetailService.addScore( referrerVip.getId(), pageOrder.getStaffId(), pageOrder.getShopId(), parentScore, pageOrder.getId(), ScoreVipDetail.SCORE_VIP_TYPE_CASH, "推荐消费奖励" ); } //推荐注册二级带新积分奖励 if (referrerVip.getRecommendId() != null) { SysVipInfo topVipInfo = sysVipInfoDao.selectById(referrerVip.getRecommendId()); if (topParentScore > 0) { scoreVipDetailService.addScore( topVipInfo.getId(), pageOrder.getStaffId(), pageOrder.getShopId(), topParentScore, pageOrder.getId(), ScoreVipDetail.SCORE_VIP_TYPE_CASH, "推荐消费奖励" ); } } } } /** * 创建支付流水 * * @author:姜友瑶 */ private void addOrderFlow(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() + "件产品"); // 若是退款,则取负数 if (SysOrder.ORDER_TYPE_REFUND == sourceOrder.getOrderType()) { flow.setFlowType(SysOrderFlow.FLOW_TYPE_REFUND); flow.setAmount(flow.getAmount().negate()); flow.setOrderId(sourceOrder.getOldOrderId()); } else { flow.setFlowType(SysOrderFlow.FLOW_TYPE_BUY); flow.setOrderId(sourceOrder.getId()); } //欠款处理 if (SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())) { sourceOrder.setStatu(Dictionary.ORDER_STATU_QK); sourceOrder.setArrears(flow.getAmount().doubleValue()); sysOrderDao.update(sourceOrder); } //统计储值卡支付 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++; } } /** * 验证商品是否达到最大发卡限制 * * @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日 */ @Transactional(rollbackFor = Exception.class) @Override public void updateAfterMoney(SysOrder pageOrder) { SysOrder sourceOrder = sysOrderDao.selectById(pageOrder.getId()); int i = 1; 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); } } 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 { 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); sysOrderDao.update(sourceOrder); } /** * @param order 新增出库单并更新本店库存 * @author:姜友瑶 * @date 2016年9月2日 */ @Override public void addOutStore(SysOrder order) { BusParameterSettings manageStockSetting = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WAREHOUSE_MANAGE_STOCK, order.getCompanyId()); if (AppConstance.IS_Y.equals(manageStockSetting.getParamValue())) { List<SysOutStoreItem> storeItemList = new ArrayList<>(); for (SysOrderItem sysOrderItem : order.getItems()) { if (ShoppingGoods.SHOPPING_GOODS_TYPE_JJCP.equals(sysOrderItem.getType())) { SysOutStoreItem storeItem = new SysOutStoreItem(); storeItem.setSkuId(sysOrderItem.getGoodsId()); storeItem.setAmount(Double.valueOf(sysOrderItem.getCount())); storeItemList.add(storeItem); } else if (ShoppingGoods.SHOPPING_GOODS_TYPE_TC.equals(sysOrderItem.getType()) || ShoppingGoods.SHOPPING_GOODS_TYPE_ZHK.equals(sysOrderItem.getType())) { List<ShoppingGoodsAssemble> goodsList = new ArrayList<>(); goodsList.addAll(shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(sysOrderItem.getGoodsId(), ShoppingGoods.SHOPPING_GOODS_TYPE_JJCP)); if (ShoppingGoods.SHOPPING_GOODS_TYPE_ZHK.equals(sysOrderItem.getType())) { //综合卡处理,中的套餐,中的家居产品 List<ShoppingGoodsAssemble> zhkAssemble = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(sysOrderItem.getGoodsId(), ShoppingGoods.SHOPPING_GOODS_TYPE_TC); zhkAssemble.forEach(item -> { goodsList.addAll(shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(item.getAssembleGoodId(), ShoppingGoods.SHOPPING_GOODS_TYPE_JJCP)); }); } goodsList.forEach(item -> { SysOutStoreItem storeItem = new SysOutStoreItem(); storeItem.setSkuId(item.getAssembleGoodId()); storeItem.setAmount(Double.valueOf(item.getTotal())); storeItemList.add(storeItem); }); } } if (CollectionUtils.isNotEmpty(storeItemList)) { Long warehouseId = warehouseDao.findShopWarehouse(order.getShopId()).get(0).getId(); SysOutStore outStore = new SysOutStore(); outStore.setOutStoreNo(codeService.getOutStoreCode()); outStore.setOrderId(order.getId()); outStore.setShopId(order.getShopId()); outStore.setShopId(order.getShopId()); outStore.setStaffId(order.getStaffId()); outStore.setType(Dictionary.OUT_STORE_JJCPCK); outStore.setServiceNo(order.getOrderNo()); outStore.setTime(new Date()); outStore.setCheckStatus(Dictionary.CHECK_STATUS_DSH); outStore.setCompanyId(order.getCompanyId()); sysOutStoreDao.insert(outStore); //出库明细,根据批次维度定义 List<SysOutStoreItem> realOutStoreItemList = new ArrayList<>(); storeItemList.forEach(outStoreItem -> { //设置出库主键 outStoreItem.setOutStoreId(outStore.getId()); //计算库存总数是否满足本次扣减的需求 List<SysStoreInfo> stores = storeInfoDao.selectStoInfoBySku(outStoreItem.getSkuId(), warehouseId); double sum = stores.stream().mapToDouble(item -> item.getStoreTotal()).sum(); if (sum < outStoreItem.getAmount()) { ShoppingGoods sysGoods = shoppingGoodsDao.selectById(outStoreItem.getSkuId()); if (sysGoods != null) { throw new GlobleException("出库失败:【" + sysGoods.getName() + "库存不足】"); } else { throw new GlobleException("出库失败没有找到出库产品"); } } //循环获取所有批次产品,并扣减库存 Double number = outStoreItem.getAmount(); for (SysStoreInfo storeInfo : stores) { Double oldStoreTotal = storeInfo.getStoreTotal(); Double surplus = storeInfo.getStoreTotal() - number; //更新库存 storeInfo.setStoreTotal(surplus < 0 ? 0 : surplus); //每次扣减库存都创建一个出库记录 SysOutStoreItem sysOutStoreItem = new SysOutStoreItem(); BeanUtils.copyProperties(outStoreItem, sysOutStoreItem); sysOutStoreItem.setStoreId(storeInfo.getId()); sysOutStoreItem.setAmount(oldStoreTotal - storeInfo.getStoreTotal()); realOutStoreItemList.add(sysOutStoreItem); storeInfoDao.update(storeInfo); //扣除后剩余库存大于0则跳出扣除,否则剩余数量的负数的绝对值就是再次扣减的数量 if (surplus > 0) { break; } else { number = Math.abs(surplus); } } }); sysOutStoreItemDao.batchInsert(realOutStoreItemList); } } else { LogUtil.debug("不管理库存"); } } /** * 新增项目和套餐的余次 * * @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; } } /** * 会员卡充值 * * @param czVo */ @Override @Transactional(rollbackFor = Exception.class) public SysOrder updateAddCardMoney(CzXkVo czVo) { SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY); // SysVipInfo vip = (SysVipInfo) WebUtil.getSession().getAttribute(SystemConstance.CURRENT_CUSTOMER); // czVo.setVipId(vip.getId()); //更新会员会员卡金额 MoneyCardUse cardUser = moneyCardUseDao.selectVipCard(czVo.getVipId()); cardUser.setRealMoney(MoneyUtil.add(cardUser.getRealMoney(), czVo.getBjmoney())); cardUser.setGiftMoney(MoneyUtil.add(cardUser.getGiftMoney(), czVo.getGiftMoney())); moneyCardUseDao.update(cardUser); // 为会员新增积分 SysVipInfo vipInfo = sysVipInfoDao.selectById(cardUser.getVipId()); vipInfo.setPointAll(vipInfo.getPointAll() == null ? 0 : vipInfo.getPointAll() + czVo.getJf()); sysVipInfoDao.update(vipInfo); // 新增一个充值订单 SysOrder order = new SysOrder(); order.setArrears(0D); order.setTotal(czVo.getBjmoney()); order.setZkTotal(czVo.getBjmoney()); order.setCashPay(czVo.getBjmoney()); order.setShopId(user.getShopId()); order.setOrderNo(codeService.getOrderCode()); order.setVipId(czVo.getVipId()); Date orderTime = new Date(); if (StringUtils.isNotBlank(czVo.getDateTime())) { orderTime = DateUtil.stringToDateNew(czVo.getDateTime(), DateUtil.DATE_FORMAT_DD); } order.setOrderTime(orderTime); order.setPayTime(orderTime); order.setRemark(cardUser.getCardName()); order.setStaffId(user.getSuId()); order.setIsCross(2 + ""); order.setOrderType(SysOrder.ORDER_TYPE_SEAL); order.setStatu(Dictionary.ORDER_STATU_YFK); order.setCompanyId(user.getCompanyId()); sysOrderDao.insert(order); SysOrderItem orderItem = new SysOrderItem(); orderItem.setOrderId(order.getId()); orderItem.setOrderNo(order.getOrderNo()); orderItem.setArrears(0D); ShoppingGoods shoppingGoods = shoppingGoodsDao.selectVipCzGoods(); orderItem.setGoodsId(shoppingGoods.getId()); orderItem.setPayMethod(Dictionary.PAY_TYPE_MOENY); orderItem.setCashPay(czVo.getBjmoney()); orderItem.setZkPrice(czVo.getBjmoney()); orderItem.setCardPay(0D); orderItem.setType(Dictionary.SHOPPING_GOODS_TYPE_CZK); orderItem.setCount(1); orderItem.setIsFree(Dictionary.FLAG_NO); orderItem.setPrice(czVo.getBjmoney()); orderItem.setStatus(Dictionary.ORDER_STATU_YFK); orderItem.setAchieveList(czVo.getAchaeveList()); orderItem.setShoppingGoods(shoppingGoods); orderItemDao.insert(orderItem); List<SysOrderItem> items = new ArrayList<>(); items.add(orderItem); order.setItems(items); //设置卡项使用流水 MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow(); moneyCardUseFlow.setTotal(czVo.getBjmoney()); moneyCardUseFlow.setGiftMoney(czVo.getGiftMoney()); moneyCardUseFlow.setCarUseId(czVo.getCardId()); moneyCardUseFlow.setVipId(czVo.getVipId()); moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_CZ); moneyCardUseFlow.setOrderNo(order.getOrderNo()); moneyCardUseFlow.setCreateTime(new Date()); moneyCardUseFlow.setOperationId(user.getSuId()); moneyCardUseFlow.setBalance(cardUser.getGiftMoney() + cardUser.getRealMoney()); moneyCardUseFlow.setCarUseId(cardUser.getId()); moneyCardUseFlowDao.insert(moneyCardUseFlow); order.setFlows(czVo.getFlows()); addOrderFlow(order); // 添加员工业绩 achieveNewService.addAchaeveByOrder(order); return order; } @Override public SysOrder findSysOrderTjByVipId(Long vipId) { return sysOrderDao.selectVipOrderInfoTotal(vipId); } @Override public List<OrderDetailVo> findApiOrderListInPage(OrderListDto orderListDto, PaginationVO pageVo) { return sysOrderDao.selectApiOrderListInPage(orderListDto, pageVo); } @Override public int findApiOrderListTotal(OrderListDto orderListDto) { return sysOrderDao.selectApiOrderListTotal(orderListDto); } @Override public OrderDetailVo findApiOrderDetailByOrderId(Long orderId) { OrderDetailVo orderDetail = sysOrderDao.selectApiOrderDetailById(orderId); if (orderDetail == null) { throw new GlobleException("该订单不存在"); } List<OrderDetailItemVo> items = orderItemDao.selectApiOrderDetailItemsByOrderId(orderId); if (CollectionUtils.isNotEmpty(items)) { for (OrderDetailItemVo item : items) { List<OrderDetailAchieveItemVo> achieveItems = achieveNewDao.selectApiOrderItemAchieve(item.getId()); item.setAchieves(achieveItems); } } orderDetail.setItems(items); return orderDetail; } @Override public List<RankingVo> findApiShopAchieveRanking(SysOrder sysOrder) { return sysOrderDao.selectShopAchieveRanking(sysOrder); } @Transactional(rollbackFor = Exception.class) @Override public void refundOrderMoney(SysOrder sysOrder) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); //原订单设置为退款状态 SysOrder sourceOrder = new SysOrder(); sourceOrder.setId(sysOrder.getOldOrderId()); sourceOrder.setIsHasRefund(SysOrder.IS_HAS_REFUND_Y); // sourceOrder.setStatu(Dictionary.ORDER_STATU_TK); sysOrderDao.update(sourceOrder); SysOrder oldOrder = sysOrderDao.selectById(sysOrder.getOldOrderId()); sysOrder.setId(null); sysOrder.setStaffId(user.getSuId()); sysOrder.setCompanyId(user.getCompanyId()); sysOrder.setShopId(user.getShopId()); sysOrder.setOrderType(SysOrder.ORDER_TYPE_REFUND); sysOrder.setStatu(Dictionary.ORDER_STATU_YFK); Date now = new Date(); sysOrder.setOrderTime(now); sysOrder.setPayTime(now); sysOrder.setOrderNo(codeService.getRefundOrderNo()); sysOrder.setZkTotal(-sysOrder.getZkTotal()); //新增订单 sysOrderDao.insert(sysOrder); //插入明细 for (SysOrderItem item : sysOrder.getItems()) { //更新原订单明细的可退数量 SysOrderItem oldItem = new SysOrderItem(); oldItem.setId(item.getId()); oldItem.setRefundCount(item.getCount()); orderItemDao.update(oldItem); //插入新的订单明细 item.setId(null); item.setCount(-item.getCount()); item.setOrderId(sysOrder.getId()); orderItemDao.insert(item); } // 添加订单收款流水 addOrderFlow(sysOrder); //退款退套餐退项目 refundProjUse(sysOrder); //删除积分 scoreVipDetailService.removeByBusinessId(oldOrder.getVipId(), oldOrder.getId()); // 设置业绩 achieveNewService.addAchaeveByOrder(sysOrder); //保存单据日志 operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.ORDER_TK, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId()); } 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); 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 sysOrder */ private void refundProjUse(SysOrder sysOrder) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); //记录需要退库存的产品 List<SysOrderItem> returnGoodsList = new ArrayList<>(); for (SysOrderItem item : sysOrder.getItems()) { SysProjUse queryProjUse = new SysProjUse(); queryProjUse.setOrderItemId(item.getOldItemId()); // 修改项目信息 if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(item.getType()) || Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(item.getType())) { if (Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(item.getType())) { if (Dictionary.FLAG_YES_Y.equals(item.getIsReturnStore())) { returnGoodsList.add(item); } } else { SysProjUse sysProjUse = sysProjUseDao.selectByModel(queryProjUse).get(0); int sub = sysProjUse.getSurplusCount() - item.getCount(); if (sub < 0) { throw new GlobleException("项目余次不足"); } else if (sub == 0) { sysProjUse.setIsOver(Dictionary.FLAG_YES_Y); sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX); } sysProjUse.setSurplusCount(sub); sysProjUseDao.update(sysProjUse); SysProjUseFlow sysProjUseFlow = SysProjUseMapper.INSTANCE.projUseToFlow(sysProjUse); sysProjUseFlow.setOptionType("退款修改"); sysProjUseFlow.setId(null); sysProjUseFlow.setUpdateBy(user.getSuName()); sysProjUseFlow.setCreateBy(user.getSuName()); sysProjUseDao.insertFlow(sysProjUseFlow); } } if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(item.getType())) { queryProjUse.setTaocanId(-1L); List<SysProjUse> sysProjUses = sysProjUseDao.selectByModel(queryProjUse); for (int i = 0; i < sysProjUses.size(); i++) { SysProjUse sysProjUse = sysProjUses.get(i); sysProjUse.setIsOver(Dictionary.FLAG_YES_Y); sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX); sysProjUseDao.update(sysProjUse); SysProjUseFlow sysProjUseFlow = SysProjUseMapper.INSTANCE.projUseToFlow(sysProjUse); sysProjUseFlow.setOptionType("退款修改"); sysProjUseFlow.setId(null); sysProjUseFlow.setUpdateBy(user.getSuName()); sysProjUseFlow.setCreateBy(user.getSuName()); sysProjUseDao.insertFlow(sysProjUseFlow); } } if (Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(item.getType())) { MoneyCardUse queryCardUse = new MoneyCardUse(); queryCardUse.setStatus(Dictionary.TAOCAN_STATUS_YX); queryCardUse.setOrderItemId(item.getOldItemId()); List<MoneyCardUse> moneyCardUses = moneyCardUseDao.selectByModel(queryCardUse); for (int i = 0; i < item.getCount(); i++) { MoneyCardUse moneyCardUse = moneyCardUses.get(i); moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX); moneyCardUseDao.update(moneyCardUse); } } // TODO 综合卡退款 if (Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(item.getType())) { } ShoppingGoods goods = shoppingGoodsDao.selectById(item.getGoodsId()); goods.setRealSealCount(goods.getRealSealCount() - item.getCount()); shoppingGoodsDao.update(goods); } BusParameterSettings manageStockSetting = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WAREHOUSE_MANAGE_STOCK, sysOrder.getCompanyId()); if (AppConstance.IS_Y.equals(manageStockSetting.getParamValue())) { // 家居产品退库存 if (CollectionUtils.isNotEmpty(returnGoodsList)) { refundInstore(returnGoodsList); } } } /** * 退款入库 */ private void refundInstore(@NotEmpty List<SysOrderItem> items) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); SysSupplierInfo supplierInfo = new SysSupplierInfo(); supplierInfo.setShopId(user.getShopId()); supplierInfo = sysSupplierInfoDao.selectByModel(supplierInfo).get(0); Warehouse warehouse = warehouseDao.findShopWarehouse(user.getShopId()).get(0); SysInstoreInfo instoreInfo = new SysInstoreInfo(); instoreInfo.setInstoreType(SysInstoreInfo.INSTORE_TYPE_RETURN); instoreInfo.setInstoreDate(new Date()); instoreInfo.setSupplierId(supplierInfo.getId().toString()); instoreInfo.setStoreId(warehouse.getId()); instoreInfo.setCheckStatus(Dictionary.CHECK_STATUS_DSH); // 设置入库单编号 instoreInfo.setInstoreId(DateUtil.getTimeMark()); instoreInfo.setShopId(user.getShopId()); instoreInfo.setCompanyId(user.getCompanyId()); sysInstoreInfoDao.insert(instoreInfo); Double total = 0.0; List<SysInstoreDetail> instoreDetails = new ArrayList<>(); for (SysOrderItem item : items) { ShoppingGoods goods = shoppingGoodsDao.selectById(item.getGoodsId()); SysInstoreDetail sysInstoreDetail = new SysInstoreDetail(); sysInstoreDetail.setAmount(item.getCount().doubleValue()); sysInstoreDetail.setPrice(item.getZkPrice()); sysInstoreDetail.setSkuId(goods.getId()); total = MoneyUtil.add(MoneyUtil.mul(Double.parseDouble(sysInstoreDetail.getAmount() + ""), sysInstoreDetail.getPrice()), total); sysInstoreDetail.setInstoreId(instoreInfo.getId()); // 设置小计 sysInstoreDetail.setPriceTotal(MoneyUtil.mul(Double.parseDouble(sysInstoreDetail.getAmount() + ""), sysInstoreDetail.getPrice())); instoreDetails.add(sysInstoreDetail); } instoreInfo.setSumall(total); sysInstoreInfoDao.update(instoreInfo); sysInstoreDetailDao.batchInsert(instoreDetails); sysInstoreInfoService.check(instoreInfo); } @Override public BigDecimal findVipArrearsByVipId(Long vipId) { return sysOrderDao.selectArrearsByVipId(vipId); } } zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOutStoreServiceImpl.java
@@ -3,30 +3,23 @@ import com.matrix.core.constance.MatrixConstance; import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.DateUtil; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.WebUtil; import com.matrix.system.common.bean.SysUsers; import com.matrix.system.constance.Dictionary; import com.matrix.system.hive.bean.SysOutStore; import com.matrix.system.hive.bean.SysOutStoreItem; import com.matrix.system.hive.bean.SysShopInfo; import com.matrix.system.hive.bean.SysStoreInfo; import com.matrix.system.hive.dao.SysOutStoreDao; import com.matrix.system.hive.dao.SysOutStoreItemDao; import com.matrix.system.hive.dao.SysStoreInfoDao; import com.matrix.system.hive.service.CodeService; import com.matrix.system.hive.service.SysOutStoreService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; /** * @date 2016-07-25 12:43 @@ -42,6 +35,7 @@ private SysStoreInfoDao storeInfoDao; @Autowired private CodeService codeService; @Override @Transactional(rollbackFor = Exception.class) @@ -142,9 +136,35 @@ } /** * 取消出库单 * @param id * @return */ @Transactional(rollbackFor = Exception.class) @Override public int checkInfo(SysOutStore sysOutStore) { public void cancelOutStore(Long id) { List<SysOutStoreItem> outStoreItemList = sysOutStoreItemDao.selectByOrderId(id); for (SysOutStoreItem item : outStoreItemList) { SysStoreInfo sysStoreInfo = storeInfoDao.selectById(item.getStoreId()); sysStoreInfo.setStoreTotal(sysStoreInfo.getStoreTotal() + item.getAmount()); //更新库存 storeInfoDao.update(sysStoreInfo); } sysOutStoreDao.deleteById(id); sysOutStoreItemDao.deleteByOrderId(id); } @Override public int effectOutStore(SysOutStore sysOutStore) { SysOutStore queryStore = sysOutStoreDao.selectById(sysOutStore.getId()); if(!queryStore.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH)){ throw new GlobleException("单据状态已更新,请刷新"); } List<SysOutStoreItem> list = queryStore.getOutStoreItems(); int flag = 0; for (SysOutStoreItem item : list) { zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
@@ -1,24 +1,35 @@ 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; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.DateUtil; import com.matrix.core.tools.WebUtil; import com.matrix.system.app.mapper.SysProjUseMapper; import com.matrix.system.common.bean.SysUsers; import com.matrix.system.common.dao.BusParameterSettingsDao; import com.matrix.system.common.dao.SysUsersDao; import com.matrix.system.common.validate.GroupValidateStatusCheckUtil; 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.hievEnum.OrderOperationEnum; import com.matrix.system.hive.plugin.util.MoneyUtil; import com.matrix.system.hive.service.ShoppingGoodsService; import com.matrix.system.hive.service.SysBeauticianStateService; 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; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * @date 2016-07-03 20:53 @@ -28,7 +39,11 @@ @Autowired private SysProjUseDao sysProjUseDao; @Autowired SysProjServicesService projServicesService; @Autowired SysBeauticianStateService sysBeauticianStateService; @Autowired private SysProjuseFreezeDao sysProjuseFreezeDao; @@ -49,6 +64,14 @@ @Autowired SysVipInfoDao sysVipInfoDao; @Autowired ShoppingGoodsService shoppingGoodsService; @Autowired BusParameterSettingsDao busParameterSettingsDao; @Autowired SysUsersDao sysUsersDao; @Override public int add(SysProjUse sysProjUse) { @@ -60,7 +83,6 @@ @Override public int modify(SysProjUse sysProjUse) { //插入套餐项目操作记录 return sysProjUseDao.update(sysProjUse); @@ -221,7 +243,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 +254,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 +295,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("人工修改"); @@ -339,11 +361,9 @@ if (Dictionary.TAOCAN_SOURCE_QY.equals(projuse.getSource())) { return; } if (projuse.getPlatformFlag().contains(Dictionary.SHOPPING_GOODS_SALE_PLATFORM_XX)) { SysOrderItem orderItem = orderItemDao.selectById(projuse.getOrderItemId()); if (!Dictionary.ORDER_STATU_YFK.equals(orderItem.getStatus())) { throw new GlobleException("该商品存在欠款!"); } String orderStatus = orderItemDao.selectOrderStatusByItemId(projuse.getOrderItemId()); if (!Dictionary.ORDER_STATU_YFK.equals(orderStatus)) { throw new GlobleException(projuse.getProjName()+"的购买订单存在欠款!"); } } @@ -364,7 +384,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 +398,6 @@ return i; } /*********************以下为项目使用情况操作***********************/ @@ -468,7 +486,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 +496,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 +533,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 +546,6 @@ sysProjUseDao.insertFlow(useFlow); return sysProjUseDao.update(sysProjUse); } /** @@ -574,7 +590,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("人工修改"); @@ -589,6 +605,248 @@ return new AjaxResult(AjaxResult.STATUS_SUCCESS, "操作成功"); } /** * 项目套餐退款 * @param projUseDtoList */ @Override public void projectTk(List<ProjUseOperationDto> 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())); projUseDtoList.forEach(projUseOperationDto -> { //校验参数 GroupValidateStatusCheckUtil.check(projUseOperationDto, ProjUseGroup.projectTk.class); ShoppingGoods shoppingGoods = shoppingGoodsMap.get(projUseOperationDto.getGoodsId()); if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(shoppingGoods.getGoodType())) { doProjectTk(projUseOperationDto); } else if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(shoppingGoods.getGoodType())) { taocanTk(projUseOperationDto); } }); } /** * 套餐退款 * @param projUseOperationDto */ private void taocanTk(ProjUseOperationDto projUseOperationDto) { List<SysProjUse> projUseList = sysProjUseDao.selectByOrderItemId(projUseOperationDto.getOrderItemId()); List<SysProjUse> tcList = projUseList.stream().filter(item -> Objects.isNull(item.getTaocanId()) && item.getStatus().equals(Dictionary.TAOCAN_STATUS_YX) ).collect(Collectors.toList()); if (tcList.size() < projUseOperationDto.getCount()) { throw new GlobleException("套餐余次不足"); } projUseOperationDto.setOrderOperationType(OrderOperationEnum.RETURN); for (int i = 0; i < projUseOperationDto.getCount(); i++) { SysProjUse sysProjUse = tcList.get(i); setTaocanTk(sysProjUse,projUseOperationDto); //设置套餐下的项目无效 projUseList.stream().filter(item->Objects.equals(sysProjUse.getId(),item.getTaocanId())).collect(Collectors.toList()) .forEach(item-> setTaocanTk(item,projUseOperationDto)); } } private void setTaocanTk(SysProjUse sysProjUse, ProjUseOperationDto projUseOperationDto) { sysProjUse.setIsOver(Dictionary.FLAG_YES_Y); sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK); sysProjUse.setSurplusCount(0); sysProjUseDao.update(sysProjUse); saveProjUseFlow(projUseOperationDto,sysProjUse); } /** * 项目退款 * @param projUseOperationDto */ private void doProjectTk(ProjUseOperationDto projUseOperationDto) { List<SysProjUse> projUseList = sysProjUseDao.selectByOrderItemId(projUseOperationDto.getOrderItemId()); if(projUseList.size()==1){ SysProjUse sysProjUse = projUseList.get(0); int sub = sysProjUse.getSurplusCount() - projUseOperationDto.getCount(); if (sub < 0) { throw new GlobleException("项目余次不足"); } else if (sub == 0) { sysProjUse.setIsOver(Dictionary.FLAG_YES_Y); sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK); } sysProjUse.setSurplusCount(sub); sysProjUseDao.update(sysProjUse); projUseOperationDto.setOrderOperationType(OrderOperationEnum.RETURN); //保存操作流水 saveProjUseFlow(projUseOperationDto,sysProjUse); }else{ throw new GlobleException("查询项目余次异常"); } } /** * 保存项目操作流水 * @param projUseOperationDto * @param sysProjUse */ private void saveProjUseFlow(ProjUseOperationDto projUseOperationDto, SysProjUse sysProjUse) { SysProjUseFlow sysProjUseFlow = SysProjUseMapper.INSTANCE.projUseToFlow(sysProjUse); sysProjUseFlow.setOptionType(projUseOperationDto.getOrderOperationType().getDisplayName()); SysUsers user = sysUsersDao.selectById(projUseOperationDto.getUpdateUserId()); sysProjUseFlow.setUpdateBy(user.getSuName()); sysProjUseFlow.setCreateBy(user.getSuName()); sysProjUseDao.insertFlow(sysProjUseFlow); } /** * 添加用户套餐 * * @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) { GroupValidateStatusCheckUtil.check(projUseOperationDto,ProjUseGroup.addTc.class); //新建套餐 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()); projUseDto.setUpdateUserId(projUseOperationDto.getUpdateUserId()); 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) { GroupValidateStatusCheckUtil.check(projUseOperationDto,ProjUseGroup.addProject.class); 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 @@ -613,4 +871,21 @@ public int findTaocanCountForCourseAndInfinite(Long taocanId, Long vipId) { return sysProjUseDao.selectTaocanCountForCourseAndInfinite(taocanId, vipId); } @Override public void deleteByOrderItemId(Long id) { int count=sysProjUseDao.selectUseCountByOrderItemId(id); if(count>0){ SysProjUse query=new SysProjUse(); query.setOrderItemId(id); List<SysProjUse> sysProjUses = sysProjUseDao.selectByModel(query); if(sysProjUses.size()>1){ throw new GlobleException(sysProjUses.get(0).getProjName()+"套餐已经被使用无法删除"); }else { throw new GlobleException(sysProjUses.get(0).getProjName()+"项目已经被使用无法删除"); } }else { sysProjUseDao.deleteByOrderItemId(id); } } } zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java
@@ -82,6 +82,13 @@ @Autowired private SysOrderDao sysOrderDao; @Override public void updateDealStatus(Long vipId, int isDeal) { SysVipInfo vipInfo = new SysVipInfo(); vipInfo.setIsDeal(isDeal); vipInfo.setIsDeal(SysVipInfo.DEAL_VIP); sysVipInfoDao.update(vipInfo); } /** * 新增会员储值卡 zq-erp/src/main/java/com/matrix/system/hive/validation/MoneyCardUseGroup.java
New file @@ -0,0 +1,24 @@ package com.matrix.system.hive.validation; public interface MoneyCardUseGroup { /** * 退款 */ interface moneyCardUseTk { } /** * 充值 */ interface moneyCardUseCz { } /** * 订单修改金额 */ interface moneyCardUseOrderChange { } } zq-erp/src/main/java/com/matrix/system/hive/validation/ProjUseGroup.java
New file @@ -0,0 +1,30 @@ package com.matrix.system.hive.validation; public interface ProjUseGroup { /** * 新增会员项目 */ interface addProject { } /** * 新增会员套餐 */ interface addTc { } /** * 退款扣减次数 */ interface projectTk { } /** * 套餐退款 */ interface taocanTk { } } zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpShoppingGoodsController.java
@@ -101,9 +101,6 @@ shoppingGoods.setAssembleGoods(assembleListGoods); List<ShoppingGoodsAssemble> assembleListProj = shoppingGoodsAssembleDao.selectProjByShoppingGoodsId(shoppingGoods.getId()); shoppingGoods.setAssembleProj(assembleListProj); } else if (Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(shoppingGoods.getGoodType())) { List<ShoppingGoodsAssemble> assembleList = shoppingGoodsAssembleDao.selectAssembleShoppingGoodsByShoppingGoodsId(shoppingGoods.getId()); shoppingGoods.setZongheCarGoods(assembleList); } @@ -132,9 +129,6 @@ // 返回充值卡编辑界面 WebUtil.getRequest().setAttribute("obj", shoppingGoods); return "admin/hive-erp/products/money-card-form"; } else if (shoppingGoods.getGoodType().equals(Dictionary.SHOPPING_GOODS_TYPE_ZHK)) { WebUtil.getRequest().setAttribute("obj", shoppingGoods); return "admin/hive-erp/products/zonghe-card-form"; } zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderOutSotoreTask.java
@@ -5,13 +5,10 @@ import com.matrix.core.tools.LogUtil; import com.matrix.system.hive.bean.SysOrder; import com.matrix.system.hive.dao.SysOrderDao; import com.matrix.system.hive.service.SysOrderService; import com.rabbitmq.client.DeliverCallback; import com.rabbitmq.client.Delivery; import com.matrix.system.hive.service.imp.SysOrderServiceHelper; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; import java.util.List; import java.util.Map; @@ -24,7 +21,7 @@ SysOrderDao sysOrderDao; @Autowired SysOrderService orderService; SysOrderServiceHelper sysOrderServiceHelper; @Override public String getName() { @@ -47,7 +44,7 @@ List<SysOrder> list = sysOrderDao.selectByModel(sourceOrder); if (CollectionUtils.isNotEmpty(list)) { //订单出库 orderService.addOutStore(list.get(0)); sysOrderServiceHelper.addOutStore(list.get(0)); } else { LogUtil.error("订单编号{}erp不存在", orderNo); } zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java
@@ -15,20 +15,17 @@ 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; import com.matrix.system.shopXcx.dao.ShopOrderDao; import com.matrix.system.shopXcx.dao.ShopOrderDetailsDao; import com.matrix.system.shopXcx.dao.ShopSkuDao; import com.rabbitmq.client.DeliverCallback; import com.rabbitmq.client.Delivery; import org.apache.logging.log4j.message.Message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.Map; @@ -87,6 +84,10 @@ @Autowired private ShopSalesmanGradeDao shopSalesmanGradeDao; @Autowired private SysOrderServiceHelper sysOrderServiceHelper; @Transactional(rollbackFor = Exception.class) public void synchronizationOrderToErp(ShopOrder orderDto) { @@ -184,30 +185,16 @@ orderItemDao.insert(orderItem); } break; case Dictionary.SHOPPING_GOODS_TYPE_ZHK: // 新增明细 orderItem.setGoodsId(shoppingGoods.getId()); // 每一个充值卡都看成一个单独的订单条目 count = orderItem.getCount(); for (int j = 0; j < count; j++) { orderItem.setCount(1); orderItem.setId(null); orderItemDao.insert(orderItem); } break; } } // 处理收款逻辑 SysOrder sourceOrder = sysOrderDao.selectById(order.getId()); sourceOrder.setItems(orderItemDao.selectByOrderId(order.getId())); // 设置会员充值卡使用情况 orderService.addMoneyCardUse(sourceOrder); sysOrderServiceHelper.addMoneyCardUse(sourceOrder); // 改变客户项目套餐使用情况 orderService.addTaocanProj(sourceOrder); // 设置销量 orderService.setShopSelCount(sourceOrder); sysOrderServiceHelper.addTaocanProj(sourceOrder); SysOrderFlow flow = new SysOrderFlow(); flow.setFlowNo(codeService.getFlowCode() + "-" + i); zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsDao.xml
@@ -3,7 +3,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.matrix.system.hive.dao.ShoppingGoodsDao"> <cache readOnly="true"></cache> <resultMap type="ShoppingGoods" id="ShoppingGoodsMap"> <id property="id" column="id" /> zq-erp/src/main/resources/mybatis/mapper/hive/SysInstoreInfoDao.xml
@@ -34,7 +34,6 @@ <insert id="insert" parameterType="SysInstoreInfo" useGeneratedKeys="true" keyProperty="id"> INSERT INTO sys_instore_info ( ID, INSTORE_DATE, INSTORE_TYPE, AMMOUNT_ALL, @@ -52,7 +51,6 @@ company_id ) VALUES ( #{id}, #{instoreDate}, #{instoreType}, #{ammountAll}, zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderItemDao.xml
@@ -88,7 +88,6 @@ <insert id="insert" parameterType="SysOrderItem" useGeneratedKeys="true" keyProperty="id"> INSERT INTO sys_order_item ( ID, ORDER_ID, COUNT, refundCount, @@ -106,7 +105,6 @@ pay_method_detail ) VALUES ( #{id}, #{orderId}, #{count}, #{refundCount}, @@ -567,5 +565,10 @@ left join sys_order b on a.ORDER_ID=b.id where a.type='家居产品' and DATE_FORMAT(a.create_time,'%Y-%m')='2021-04' and b.company_id=17 and b.STATU='已付款'; </select> <select id="selectOrderStatusByItemId" resultType="java.lang.String"> select b.statu from sys_order_item a left join sys_order b on a.ORDER_ID=b.id where a.id=#{orderItemId} </select> </mapper> zq-erp/src/main/resources/mybatis/mapper/hive/SysProjUseDao.xml
@@ -65,7 +65,6 @@ create_time, update_by, update_time, id, proj_use_id, surplus_count, is_over, @@ -82,7 +81,6 @@ now(), #{updateBy}, now(), #{id}, #{projUseId}, #{surplusCount}, #{isOver}, @@ -948,4 +946,15 @@ select count(1) from sys_proj_use where taocan_id=#{taocanId} and vip_id=#{vipId} </select> <select id="selectUseCountByOrderItemId" resultType="java.lang.Integer"> SELECT count(*) from sys_beautician_state a LEFT JOIN sys_proj_use b on a.puse_id=b.ID left join sys_proj_services c on a.SERVICES_ID=c.id where b.ORDER_ITEM_ID=#{orderItemId} and c.STATE !='预约取消'; </select> <select id="selectByOrderItemId" resultType="com.matrix.system.hive.bean.SysProjUse"> select * from sys_proj_use where ORDER_ITEM_ID =#{orderItemId} </select> </mapper> zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form.html
@@ -212,8 +212,10 @@ label="单价"> </el-table-column> <el-table-column prop="count" label="可退数量"> <template slot-scope="scope"> {{scope.row.count- scope.row.refundCount}} </template> </el-table-column> <el-table-column label="退款单价"> <template slot-scope="scope"> @@ -683,7 +685,7 @@ } } item.achaeveList = achieveList; item.achieveList = achieveList; } if (item.returnStore) { item.isReturnStore = 'Y'; 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> zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-md-list.html
@@ -54,12 +54,10 @@ </div> <div class="form-group mr-20"> <label for="staus">状态</label> <select class="form-control autoFull" name="staus" nullmsg="状态不能为空" dataType="*" id="staus" data-filed="name" data-value="name" th:data-url="@{/admin/dataDictionary/showDataDictionary}" data-param="{type:'项目状态'}"> <option value=''>请选择项目状态</option> <select class="form-control " name="staus" nullmsg="状态不能为空" dataType="*" id="staus"> <option value=''>全部</option> <option value='上架' selected ="selected ">上架</option> <option value=''>下架</option> </select> </div> <div class="form-group mr-20"> zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-zb-list.html
@@ -55,12 +55,10 @@ </div> <div class="form-group mr-20"> <label for="staus">状态</label> <select class="form-control autoFull" name="staus" nullmsg="状态不能为空" dataType="*" id="staus" data-filed="name" data-value="name" th:data-url="@{/admin/dataDictionary/showDataDictionary}" data-param="{type:'项目状态'}"> <option value=''>请选择项目状态</option> <select class="form-control " name="staus" nullmsg="状态不能为空" dataType="*" id="staus"> <option value=''>全部</option> <option value='上架' selected ="selected ">上架</option> <option value=''>下架</option> </select> </div> <div class="form-group mr-20">