Merge branch 'Bulbasaur' of gitee.com:beijing_hongye_huicheng/lilishop into Bulbasaur
This commit is contained in:
commit
30d34d69f1
@ -1,5 +1,6 @@
|
||||
package cn.lili.controller.member;
|
||||
|
||||
import cn.lili.common.enums.SwitchEnum;
|
||||
import cn.lili.common.security.context.UserContext;
|
||||
import cn.lili.common.enums.ResultUtil;
|
||||
import cn.lili.common.vo.ResultMessage;
|
||||
@ -55,7 +56,7 @@ public class MemberEvaluationBuyerController {
|
||||
public ResultMessage<IPage<MemberEvaluation>> queryMineEvaluation(EvaluationQueryParams evaluationQueryParams) {
|
||||
//设置当前登录会员
|
||||
evaluationQueryParams.setMemberId(UserContext.getCurrentUser().getId());
|
||||
return ResultUtil.data(memberEvaluationService.queryByParams(evaluationQueryParams));
|
||||
return ResultUtil.data(memberEvaluationService.managerQuery(evaluationQueryParams));
|
||||
}
|
||||
|
||||
@ApiOperation(value = "查看某一个商品的评价列表")
|
||||
@ -65,7 +66,8 @@ public class MemberEvaluationBuyerController {
|
||||
@NotNull @PathVariable("goodsId") String goodsId) {
|
||||
//设置查询查询商品
|
||||
evaluationQueryParams.setGoodsId(goodsId);
|
||||
return ResultUtil.data(memberEvaluationService.queryByParams(evaluationQueryParams));
|
||||
evaluationQueryParams.setStatus(SwitchEnum.OPEN.name());
|
||||
return ResultUtil.data(memberEvaluationService.managerQuery(evaluationQueryParams));
|
||||
}
|
||||
|
||||
@ApiOperation(value = "查看某一个商品的评价数量")
|
||||
|
@ -222,8 +222,7 @@ lili:
|
||||
#支付密码
|
||||
WALLET_PASSWORD: SMS_205755301
|
||||
system:
|
||||
isDemoSite: true
|
||||
licences: 'temporary'
|
||||
isTestModel: true
|
||||
statistics:
|
||||
# 在线人数统计 X 小时。这里设置48,即统计过去48小时每小时在线人数
|
||||
onlineMember: 48
|
||||
|
@ -224,6 +224,7 @@ lili:
|
||||
WALLET_PASSWORD: SMS_205755301
|
||||
system:
|
||||
isDemoSite: false
|
||||
isTestModel: true
|
||||
statistics:
|
||||
# 在线人数统计 X 小时。这里设置48,即统计过去48小时每小时在线人数
|
||||
onlineMember: 48
|
||||
|
@ -12,6 +12,7 @@ import cn.lili.modules.order.order.service.OrderService;
|
||||
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
||||
import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum;
|
||||
import cn.lili.modules.promotion.service.PromotionGoodsService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.data.redis.core.script.DefaultRedisScript;
|
||||
@ -26,9 +27,12 @@ import java.util.List;
|
||||
* @author Chopper
|
||||
* @date 2020-07-03 11:20
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class StockUpdateExecute implements OrderStatusChangeEvent {
|
||||
|
||||
//出库失败消息
|
||||
static String outOfStockMessage = "库存不足,出库失败";
|
||||
//Redis
|
||||
@Autowired
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
@ -52,6 +56,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
||||
|
||||
switch (orderMessage.getNewStatus()) {
|
||||
case PAID: {
|
||||
//获取订单详情
|
||||
OrderDetailVO order = orderService.queryDetail(orderMessage.getOrderSn());
|
||||
//库存key 和 扣减数量
|
||||
List<String> keys = new ArrayList<>();
|
||||
@ -66,32 +71,41 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
||||
Boolean skuResult = stringRedisTemplate.execute(quantityScript, keys, values.toArray());
|
||||
//如果库存扣减都成功,则记录成交订单
|
||||
if (Boolean.TRUE.equals(skuResult)) {
|
||||
log.info("库存扣减成功,参数为{};{}", keys, values);
|
||||
//库存确认之后对结构处理
|
||||
orderService.afterOrderConfirm(orderMessage.getOrderSn());
|
||||
//成功之后,同步库存
|
||||
synchroDB(order);
|
||||
} else {
|
||||
log.info("库存扣件失败,变更缓存key{} 变更缓存value{}", keys, values);
|
||||
//失败之后取消订单
|
||||
this.errorOrder(orderMessage.getOrderSn());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CANCELLED: {
|
||||
//获取订单详情
|
||||
OrderDetailVO order = orderService.queryDetail(orderMessage.getOrderSn());
|
||||
if (order.getOrder().getPayStatus().equals(PayStatusEnum.PAID.name())) {
|
||||
//判定是否已支付 并且 非库存不足导致库存回滚 则需要考虑订单库存返还业务
|
||||
if (order.getOrder().getPayStatus().equals(PayStatusEnum.PAID.name()) && order.getOrder().getCancelReason().equals(outOfStockMessage)) {
|
||||
//库存key 和 还原数量
|
||||
List<String> keys = new ArrayList<>();
|
||||
List<String> values = new ArrayList<>();
|
||||
|
||||
//返还商品库存,促销库存不与返还,不然前台展示层有展示逻辑错误
|
||||
for (OrderItem orderItem : order.getOrderItems()) {
|
||||
if (PromotionTypeEnum.haveStock(orderItem.getPromotionType())) {
|
||||
PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(orderItem.getPromotionType());
|
||||
Integer goodsPromotionOriginStock = promotionGoodsService.getPromotionGoodsStock(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId());
|
||||
int goodsPromotionStock = goodsPromotionOriginStock + orderItem.getNum();
|
||||
String promotionGoodsStockCacheKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId());
|
||||
stringRedisTemplate.opsForValue().set(promotionGoodsStockCacheKey, Integer.toString(goodsPromotionStock));
|
||||
}
|
||||
String stockCacheKey = GoodsSkuService.getStockCacheKey(orderItem.getSkuId());
|
||||
Integer goodsOriginStock = goodsSkuService.getStock(orderItem.getSkuId());
|
||||
int goodsStock = goodsOriginStock + orderItem.getNum();
|
||||
stringRedisTemplate.opsForValue().set(stockCacheKey, Integer.toString(goodsStock));
|
||||
keys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId()));
|
||||
int i = orderItem.getNum();
|
||||
values.add(Integer.toString(i));
|
||||
}
|
||||
//批量脚本执行库存回退
|
||||
Boolean skuResult = stringRedisTemplate.execute(quantityScript, keys, values.toArray());
|
||||
|
||||
//返还失败,则记录日志
|
||||
if (Boolean.FALSE.equals(skuResult)) {
|
||||
log.error("库存回退异常,keys:{},回复库存值为: {}", keys, values);
|
||||
}
|
||||
rollbackOrderStock(order);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -106,7 +120,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
||||
* @param orderSn 失败入库订单信息
|
||||
*/
|
||||
private void errorOrder(String orderSn) {
|
||||
orderService.systemCancel(orderSn, "库存不足,出库失败");
|
||||
orderService.systemCancel(orderSn, outOfStockMessage);
|
||||
}
|
||||
|
||||
|
||||
@ -130,8 +144,9 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 写入需要更改促销库存的商品
|
||||
* 同步库存和促销库存
|
||||
*
|
||||
* @param order 订单
|
||||
*/
|
||||
@ -157,6 +172,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
||||
if (PromotionTypeEnum.haveStock(orderItem.getPromotionType())) {
|
||||
PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(orderItem.getPromotionType());
|
||||
PromotionGoods pGoods = promotionGoodsService.getPromotionGoods(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId());
|
||||
//记录需要更新的促销库存信息
|
||||
promotionKey.add(
|
||||
PromotionGoodsService.getPromotionGoodsStockCacheKey(
|
||||
promotionTypeEnum,
|
||||
@ -168,6 +184,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
||||
goodsSkus.add(goodsSku);
|
||||
}
|
||||
|
||||
//批量获取商品库存
|
||||
List skuStocks = cache.multiGet(skuKeys);
|
||||
//循环写入商品库存
|
||||
for (int i = 0; i < skuStocks.size(); i++) {
|
||||
@ -186,8 +203,41 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
||||
}
|
||||
promotionGoodsService.updateBatchById(promotionGoods);
|
||||
}
|
||||
//商品库存,包含sku库存集合,批量更新商品库存相关
|
||||
goodsSkuService.updateGoodsStuck(goodsSkus);
|
||||
|
||||
log.info("订单确认,库存同步:商品信息--{};促销信息---{}", goodsSkus, promotionGoods);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 恢复商品库存
|
||||
*
|
||||
* @param order 订单
|
||||
*/
|
||||
private void rollbackOrderStock(OrderDetailVO order) {
|
||||
|
||||
//sku商品
|
||||
List<GoodsSku> goodsSkus = new ArrayList<>();
|
||||
//sku库存key 集合
|
||||
List<String> skuKeys = new ArrayList<>();
|
||||
// 循环订单
|
||||
for (OrderItem orderItem : order.getOrderItems()) {
|
||||
skuKeys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId()));
|
||||
GoodsSku goodsSku = new GoodsSku();
|
||||
goodsSku.setId(orderItem.getSkuId());
|
||||
goodsSkus.add(goodsSku);
|
||||
}
|
||||
//批量获取商品库存
|
||||
List skuStocks = cache.multiGet(skuKeys);
|
||||
//循环写入商品SKU库存
|
||||
for (int i = 0; i < skuStocks.size(); i++) {
|
||||
goodsSkus.get(i).setQuantity(Integer.parseInt(skuStocks.get(i).toString()));
|
||||
}
|
||||
log.info("订单取消,库存还原:{}", goodsSkus);
|
||||
//批量修改商品库存
|
||||
goodsSkuService.updateBatchById(goodsSkus);
|
||||
goodsSkuService.updateGoodsStuck(goodsSkus);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import cn.lili.common.sms.SmsUtil;
|
||||
import cn.lili.common.utils.CommonUtil;
|
||||
import cn.lili.common.verification.enums.VerificationEnums;
|
||||
import cn.lili.config.properties.SmsTemplateSetting;
|
||||
import cn.lili.config.properties.SystemSetting;
|
||||
import cn.lili.modules.connect.util.Base64Utils;
|
||||
import cn.lili.modules.member.entity.dos.Member;
|
||||
import cn.lili.modules.member.service.MemberService;
|
||||
@ -55,6 +56,9 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil {
|
||||
@Autowired
|
||||
private SmsTemplateSetting smsTemplateSetting;
|
||||
|
||||
@Autowired
|
||||
private SystemSetting systemSetting;
|
||||
|
||||
@Override
|
||||
public void sendSmsCode(String mobile, VerificationEnums verificationEnums, String uuid) {
|
||||
//获取短信配置
|
||||
@ -115,12 +119,15 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil {
|
||||
default:
|
||||
return;
|
||||
}
|
||||
log.info("短信验证码:"+code);
|
||||
//如果是测试模式 默认验证码 6个1
|
||||
if (systemSetting.getIsTestModel()) {
|
||||
code = "111111";
|
||||
} else {
|
||||
//发送短信
|
||||
this.sendSmsCode(smsSetting.getSignName(), mobile, params, templateCode);
|
||||
}
|
||||
//缓存中写入要验证的信息
|
||||
cache.put(cacheKey(verificationEnums, mobile, uuid), code, 300L);
|
||||
//发送短信
|
||||
this.sendSmsCode(smsSetting.getSignName(), mobile, params, templateCode);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,5 +1,7 @@
|
||||
package cn.lili.common.utils;
|
||||
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.lili.modules.payment.kit.dto.PayParam;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
@ -56,4 +58,75 @@ public class BeanUtil {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 将对象转换为key value
|
||||
* A=a&B=b&C=c 格式
|
||||
*/
|
||||
public static String formatKeyValuePair(Object object) {
|
||||
//准备接受的字符串
|
||||
StringBuilder stringBuffer = new StringBuilder();
|
||||
//获取对象字段
|
||||
String[] fieldNames = BeanUtil.getFiledName(object);
|
||||
//遍历所有属性
|
||||
for (int j = 0; j < fieldNames.length; j++) {
|
||||
//不是第一个并且不是最后一个,拼接&
|
||||
if (j != 0) {
|
||||
stringBuffer.append("&");
|
||||
}
|
||||
//获取属性的名字
|
||||
String key = fieldNames[j];
|
||||
//获取值
|
||||
Object value = BeanUtil.getFieldValueByName(key, object);
|
||||
stringBuffer.append(key).append("=").append(value.toString());
|
||||
}
|
||||
return stringBuffer.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* key value键值对 转换为 对象
|
||||
* A=a&B=b&C=c 格式 转换为对象
|
||||
*/
|
||||
public static <T> T formatKeyValuePair(String str, T t) {
|
||||
//填写对参数键值对
|
||||
String[] params = str.split("&");
|
||||
|
||||
//获取对象字段
|
||||
String[] fieldNames = BeanUtil.getFiledName(t);
|
||||
|
||||
try {
|
||||
//循环每个参数
|
||||
for (String param : params) {
|
||||
String[] keyValues = param.split("=");
|
||||
for (int i = 0; i < fieldNames.length; i++) {
|
||||
if (fieldNames[i].equals(keyValues[0])) {
|
||||
Field f = t.getClass().getDeclaredField(fieldNames[i]);
|
||||
f.setAccessible(true);
|
||||
//长度为2 才转换,否则不转
|
||||
if (keyValues.length == 2) {
|
||||
f.set(t, keyValues[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IllegalAccessException {
|
||||
PayParam payParam = new PayParam();
|
||||
payParam.setClientType("client");
|
||||
payParam.setOrderType("");
|
||||
payParam.setSn("sn");
|
||||
String val = formatKeyValuePair(payParam);
|
||||
System.out.println(val);
|
||||
|
||||
PayParam param = formatKeyValuePair(val, new PayParam());
|
||||
System.out.println(JSONUtil.toJsonStr(param));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -12,6 +12,8 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* 字串工具类
|
||||
@ -250,6 +252,19 @@ public class StringUtils extends StrUtil {
|
||||
}
|
||||
return str.concat(appendStr);
|
||||
}
|
||||
|
||||
/**
|
||||
* 过滤特殊字符串
|
||||
*
|
||||
* @param str
|
||||
* @return
|
||||
*/
|
||||
public static String filterSpecialChart(String str) {
|
||||
String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
|
||||
Pattern p = Pattern.compile(regEx);
|
||||
Matcher m = p.matcher(str);
|
||||
return m.replaceAll("").trim();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -20,6 +20,12 @@ public class SystemSetting {
|
||||
*/
|
||||
private Boolean isDemoSite = false;
|
||||
|
||||
/**
|
||||
* 测试模式
|
||||
* 验证码短信为6个1
|
||||
*/
|
||||
private Boolean isTestModel = false;
|
||||
|
||||
/**
|
||||
* 授权信息
|
||||
*/
|
||||
|
@ -101,7 +101,7 @@ public class CodeGenerator {
|
||||
*/
|
||||
public static void main(String[] args) throws IOException {
|
||||
// 模板路径
|
||||
ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader("/templates/java/");
|
||||
ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader("/templates/");
|
||||
Configuration cfg = Configuration.defaultConfiguration();
|
||||
GroupTemplate gt = new GroupTemplate(resourceLoader, cfg);
|
||||
// 生成代码
|
||||
|
@ -1,15 +1,18 @@
|
||||
package cn.lili.modules.goods.entity.dos;
|
||||
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.lili.base.BaseEntity;
|
||||
import cn.lili.modules.goods.entity.dto.GoodsOperationDTO;
|
||||
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
|
||||
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Table;
|
||||
import javax.validation.constraints.Max;
|
||||
@ -182,12 +185,19 @@ public class Goods extends BaseEntity {
|
||||
@ApiModelProperty(value = "销售模式", required = true)
|
||||
private String salesModel;
|
||||
|
||||
|
||||
/**
|
||||
* @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum
|
||||
*/
|
||||
@ApiModelProperty(value = "商品类型", required = true)
|
||||
private String goodsType;
|
||||
|
||||
@ApiModelProperty(value = "商品参数json", hidden = true)
|
||||
@Column(columnDefinition = "TEXT")
|
||||
@JsonIgnore
|
||||
private String params;
|
||||
|
||||
|
||||
public Goods() {
|
||||
}
|
||||
|
||||
@ -207,6 +217,9 @@ public class Goods extends BaseEntity {
|
||||
this.intro = goodsOperationDTO.getIntro();
|
||||
this.mobileIntro = goodsOperationDTO.getMobileIntro();
|
||||
this.cost = goodsOperationDTO.getCost();
|
||||
if (goodsOperationDTO.getGoodsParamsList() != null && goodsOperationDTO.getGoodsParamsList().isEmpty()) {
|
||||
this.params = JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsList());
|
||||
}
|
||||
//如果立即上架则
|
||||
this.marketEnable = goodsOperationDTO.isRelease() ? GoodsStatusEnum.UPPER.name() : GoodsStatusEnum.DOWN.name();
|
||||
this.goodsType=goodsOperationDTO.getGoodsType();
|
||||
|
@ -164,8 +164,7 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> i
|
||||
Category parentCategory = this.getById(category.getParentId());
|
||||
category.setDeleteFlag(parentCategory.getDeleteFlag());
|
||||
}
|
||||
save(category);
|
||||
//清除缓存
|
||||
this.save(category);
|
||||
removeCache();
|
||||
return true;
|
||||
}
|
||||
|
@ -11,10 +11,7 @@ import cn.lili.common.rocketmq.tags.GoodsTagsEnum;
|
||||
import cn.lili.common.security.context.UserContext;
|
||||
import cn.lili.common.utils.PageUtil;
|
||||
import cn.lili.config.rocketmq.RocketmqCustomProperties;
|
||||
import cn.lili.modules.goods.entity.dos.Goods;
|
||||
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
||||
import cn.lili.modules.goods.entity.dos.SpecValues;
|
||||
import cn.lili.modules.goods.entity.dos.Specification;
|
||||
import cn.lili.modules.goods.entity.dos.*;
|
||||
import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
|
||||
import cn.lili.modules.goods.entity.dto.GoodsSkuStockDTO;
|
||||
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
|
||||
@ -26,6 +23,7 @@ import cn.lili.modules.member.entity.dos.FootPrint;
|
||||
import cn.lili.modules.member.entity.dos.MemberEvaluation;
|
||||
import cn.lili.modules.member.entity.enums.EvaluationGradeEnum;
|
||||
import cn.lili.modules.member.service.MemberEvaluationService;
|
||||
import cn.lili.modules.promotion.service.PromotionService;
|
||||
import cn.lili.modules.search.entity.dos.EsGoodsAttribute;
|
||||
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
||||
import cn.lili.modules.search.service.EsGoodsIndexService;
|
||||
@ -83,14 +81,20 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
||||
private GoodsService goodsService;
|
||||
//商品索引
|
||||
private EsGoodsIndexService goodsIndexService;
|
||||
@Autowired
|
||||
private ParametersService parametersService;
|
||||
@Autowired
|
||||
private PromotionService promotionService;
|
||||
|
||||
@Override
|
||||
public void add(List<Map<String, Object>> skuList, Goods goods) {
|
||||
// 检查是否需要生成索引
|
||||
boolean needIndex = checkNeedIndex(goods);
|
||||
List<GoodsSku> newSkuList;
|
||||
// 如果有规格
|
||||
if (skuList != null && !skuList.isEmpty()) {
|
||||
// 添加商品sku
|
||||
newSkuList = this.addGoodsSku(skuList, goods);
|
||||
newSkuList = this.addGoodsSku(skuList, goods, needIndex);
|
||||
} else {
|
||||
throw new ServiceException("规格必须要有一个!");
|
||||
}
|
||||
@ -99,8 +103,23 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
||||
generateEsCheck(goods);
|
||||
}
|
||||
|
||||
private boolean checkNeedIndex(Goods goods) {
|
||||
if (goods.getParams() != null && !goods.getParams().isEmpty()) {
|
||||
List<GoodsParams> goodsParams = JSONUtil.toList(goods.getParams(), GoodsParams.class);
|
||||
for (GoodsParams goodsParam : goodsParams) {
|
||||
Parameters parameters = parametersService.getById(goodsParam.getParamId());
|
||||
if (parameters.getIsIndex() == 1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(List<Map<String, Object>> skuList, Goods goods, Boolean regeneratorSkuFlag) {
|
||||
// 检查是否需要生成索引
|
||||
boolean needIndex = checkNeedIndex(goods);
|
||||
// 是否存在规格
|
||||
if (skuList == null || skuList.isEmpty()) {
|
||||
throw new ServiceException("规格必须要有一个!");
|
||||
@ -120,7 +139,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
||||
//删除sku相册
|
||||
goodsGalleryService.removeByIds(oldSkuIds);
|
||||
// 添加商品sku
|
||||
newSkuList = this.addGoodsSku(skuList, goods);
|
||||
newSkuList = this.addGoodsSku(skuList, goods, needIndex);
|
||||
|
||||
//发送mq消息
|
||||
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.SKU_DELETE.name();
|
||||
@ -142,7 +161,9 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
||||
this.updateBatchById(newSkuList);
|
||||
}
|
||||
this.updateStock(newSkuList);
|
||||
generateEsCheck(goods);
|
||||
if (Boolean.TRUE.equals(needIndex)) {
|
||||
generateEsCheck(goods);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -198,7 +219,8 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
||||
// 获取当前商品的索引信息
|
||||
EsGoodsIndex goodsIndex = goodsIndexService.findById(skuId);
|
||||
if (goodsIndex == null) {
|
||||
goodsIndex = goodsIndexService.resetEsGoodsIndex(goodsSku);
|
||||
goodsIndex = new EsGoodsIndex(goodsSku);
|
||||
goodsIndex.setPromotionMap(promotionService.getGoodsCurrentPromotionMap(goodsIndex));
|
||||
}
|
||||
//商品规格
|
||||
GoodsSkuVO goodsSkuDetail = this.getGoodsSkuVO(goodsSku);
|
||||
@ -416,7 +438,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
||||
//修改规格
|
||||
this.update(goodsSku);
|
||||
//修改规格索引
|
||||
goodsIndexService.updateIndexCommentNum(goodsSku.getId(), goodsSku.getCommentNum(), (int) highPraiseNum, grade);
|
||||
goodsIndexService.updateIndexCommentNum(goodsSku.getId(), goodsSku.getCommentNum(), highPraiseNum, grade);
|
||||
|
||||
//修改商品的评价数量
|
||||
goodsService.updateGoodsCommentNum(goodsSku.getGoodsId());
|
||||
@ -479,7 +501,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
||||
* @param skuList sku列表
|
||||
* @param goods 商品信息
|
||||
*/
|
||||
private List<GoodsSku> addGoodsSku(List<Map<String, Object>> skuList, Goods goods) {
|
||||
private List<GoodsSku> addGoodsSku(List<Map<String, Object>> skuList, Goods goods, Boolean needIndex) {
|
||||
List<GoodsSku> skus = new ArrayList<>();
|
||||
List<EsGoodsIndex> goodsIndices = new ArrayList<>();
|
||||
for (Map<String, Object> skuVO : skuList) {
|
||||
@ -495,9 +517,11 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
||||
stringRedisTemplate.opsForValue().set(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity().toString());
|
||||
}
|
||||
this.saveBatch(skus);
|
||||
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GENERATOR_GOODS_INDEX.name();
|
||||
//发送mq消息
|
||||
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goodsIndices), RocketmqSendCallbackBuilder.commonCallback());
|
||||
if (Boolean.TRUE.equals(needIndex)) {
|
||||
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GENERATOR_GOODS_INDEX.name();
|
||||
//发送mq消息
|
||||
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goodsIndices), RocketmqSendCallbackBuilder.commonCallback());
|
||||
}
|
||||
return skus;
|
||||
}
|
||||
|
||||
@ -617,7 +641,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
||||
sku.setSmall(small);
|
||||
|
||||
//规格信息
|
||||
sku.setId(Convert.toStr(map.get("id"), "").toString());
|
||||
sku.setId(Convert.toStr(map.get("id"), ""));
|
||||
sku.setSn(Convert.toStr(map.get("sn")));
|
||||
sku.setWeight(Convert.toDouble(map.get("weight"), 0D));
|
||||
sku.setPrice(Convert.toDouble(map.get("price"), 0D));
|
||||
|
@ -15,6 +15,10 @@ import lombok.Data;
|
||||
@Data
|
||||
public class EvaluationQueryParams extends PageVO {
|
||||
|
||||
|
||||
@ApiModelProperty(value = "买家ID")
|
||||
private String memberId;
|
||||
|
||||
@ApiModelProperty(value = "会员名称")
|
||||
private String memberName;
|
||||
|
||||
@ -24,9 +28,6 @@ public class EvaluationQueryParams extends PageVO {
|
||||
@ApiModelProperty(value = "卖家ID")
|
||||
private String storeId;
|
||||
|
||||
@ApiModelProperty(value = "买家ID", hidden = true)
|
||||
private String memberId;
|
||||
|
||||
@ApiModelProperty(value = "商品名称")
|
||||
private String goodsName;
|
||||
|
||||
@ -45,6 +46,9 @@ public class EvaluationQueryParams extends PageVO {
|
||||
@ApiModelProperty(value = "评论日期--结束时间")
|
||||
private String endTime;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private String status;
|
||||
|
||||
public EvaluationQueryParams() {
|
||||
|
||||
}
|
||||
@ -78,6 +82,9 @@ public class EvaluationQueryParams extends PageVO {
|
||||
if (StringUtils.isNotEmpty(haveImage)) {
|
||||
queryWrapper.eq("have_image", haveImage);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(status)) {
|
||||
queryWrapper.eq("status", status);
|
||||
}
|
||||
queryWrapper.eq("delete_flag", false);
|
||||
queryWrapper.orderByDesc("create_time");
|
||||
return queryWrapper;
|
||||
|
@ -1,59 +0,0 @@
|
||||
package cn.lili.modules.member.entity.dto;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.lili.common.security.context.UserContext;
|
||||
import cn.lili.common.utils.StringUtils;
|
||||
import cn.lili.common.vo.PageVO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 店铺评价查询参数
|
||||
*
|
||||
* @author Chopper
|
||||
* @date 2021/3/20 10:43
|
||||
*/
|
||||
|
||||
@Data
|
||||
public class StoreEvaluationQueryParams extends PageVO {
|
||||
|
||||
@ApiModelProperty(value = "会员名称")
|
||||
private String memberName;
|
||||
|
||||
@ApiModelProperty(value = "商品名称")
|
||||
private String goodsName;
|
||||
|
||||
@ApiModelProperty(value = "好中差评 good:好评,neutral:中评,bad:差评", allowableValues = "GOOD,NEUTRAL,BAD")
|
||||
private String grade;
|
||||
|
||||
@ApiModelProperty(value = "评论日期--开始时间")
|
||||
private String startDate;
|
||||
|
||||
@ApiModelProperty(value = "评论日期--结束时间")
|
||||
private String endDate;
|
||||
|
||||
|
||||
public <T> QueryWrapper<T> queryWrapper() {
|
||||
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
||||
|
||||
queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId());
|
||||
|
||||
if (StringUtils.isNotEmpty(startDate) && StringUtils.isNotEmpty(endDate)) {
|
||||
queryWrapper.between("create_time", DateUtil.parse(startDate), DateUtil.parse(endDate));
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(grade)) {
|
||||
queryWrapper.eq("grade", grade);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(goodsName)) {
|
||||
queryWrapper.eq("goods_name", goodsName);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(memberName)) {
|
||||
queryWrapper.eq("member_name", memberName);
|
||||
}
|
||||
return queryWrapper;
|
||||
}
|
||||
}
|
@ -25,7 +25,7 @@ public interface MemberEvaluationMapper extends BaseMapper<MemberEvaluation> {
|
||||
@Select("select me.* from li_member_evaluation as me ${ew.customSqlSegment}")
|
||||
IPage<MemberEvaluationListVO> getMemberEvaluationList(IPage<MemberEvaluationListVO> page, @Param(Constants.WRAPPER) Wrapper<MemberEvaluationListVO> queryWrapper);
|
||||
|
||||
@Select("select grade,count(1) as num from li_member_evaluation Where goods_id=#{goodsId} GROUP BY grade")
|
||||
@Select("select grade,count(1) as num from li_member_evaluation Where goods_id=#{goodsId} and status='OPEN' GROUP BY grade")
|
||||
List<Map<String, Object>> getEvaluationNumber(String goodsId);
|
||||
|
||||
@Select("SELECT round( AVG( delivery_score ), 2 ) AS delivery_score" +
|
||||
|
@ -1,10 +1,8 @@
|
||||
package cn.lili.modules.member.service;
|
||||
|
||||
import cn.lili.common.vo.PageVO;
|
||||
import cn.lili.modules.member.entity.dos.MemberEvaluation;
|
||||
import cn.lili.modules.member.entity.dto.EvaluationQueryParams;
|
||||
import cn.lili.modules.member.entity.dto.MemberEvaluationDTO;
|
||||
import cn.lili.modules.member.entity.dto.StoreEvaluationQueryParams;
|
||||
import cn.lili.modules.member.entity.vo.EvaluationNumberVO;
|
||||
import cn.lili.modules.member.entity.vo.MemberEvaluationListVO;
|
||||
import cn.lili.modules.member.entity.vo.MemberEvaluationVO;
|
||||
@ -25,23 +23,14 @@ public interface MemberEvaluationService extends IService<MemberEvaluation> {
|
||||
* @param evaluationQueryParams 评价查询
|
||||
* @return 评价分页
|
||||
*/
|
||||
IPage<MemberEvaluation> queryByParams(EvaluationQueryParams evaluationQueryParams);
|
||||
|
||||
/**
|
||||
* 商家查询会员的评价分页列表
|
||||
*
|
||||
* @param storeEvaluationQueryParams 评价查询
|
||||
* @return 会员的评价分页
|
||||
*/
|
||||
IPage<MemberEvaluationListVO> queryByParams(StoreEvaluationQueryParams storeEvaluationQueryParams);
|
||||
IPage<MemberEvaluation> managerQuery(EvaluationQueryParams evaluationQueryParams);
|
||||
|
||||
/**
|
||||
* 查询评价分页列表
|
||||
* @param evaluationQueryParams 评价查询条件
|
||||
* @param page 分页查询参数
|
||||
* @return 评价分页列表
|
||||
*/
|
||||
IPage<MemberEvaluationListVO> queryPage(EvaluationQueryParams evaluationQueryParams, PageVO page);
|
||||
IPage<MemberEvaluationListVO> queryPage(EvaluationQueryParams evaluationQueryParams);
|
||||
|
||||
/**
|
||||
* 添加会员评价
|
||||
|
@ -3,8 +3,8 @@ package cn.lili.modules.member.serviceimpl;
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.lili.common.enums.SwitchEnum;
|
||||
import cn.lili.common.enums.ResultCode;
|
||||
import cn.lili.common.enums.SwitchEnum;
|
||||
import cn.lili.common.exception.ServiceException;
|
||||
import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder;
|
||||
import cn.lili.common.rocketmq.tags.GoodsTagsEnum;
|
||||
@ -12,7 +12,6 @@ import cn.lili.common.security.context.UserContext;
|
||||
import cn.lili.common.security.enums.UserEnums;
|
||||
import cn.lili.common.utils.PageUtil;
|
||||
import cn.lili.common.utils.StringUtils;
|
||||
import cn.lili.common.vo.PageVO;
|
||||
import cn.lili.config.rocketmq.RocketmqCustomProperties;
|
||||
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
||||
import cn.lili.modules.goods.service.GoodsSkuService;
|
||||
@ -20,7 +19,6 @@ import cn.lili.modules.member.entity.dos.Member;
|
||||
import cn.lili.modules.member.entity.dos.MemberEvaluation;
|
||||
import cn.lili.modules.member.entity.dto.EvaluationQueryParams;
|
||||
import cn.lili.modules.member.entity.dto.MemberEvaluationDTO;
|
||||
import cn.lili.modules.member.entity.dto.StoreEvaluationQueryParams;
|
||||
import cn.lili.modules.member.entity.enums.EvaluationGradeEnum;
|
||||
import cn.lili.modules.member.entity.vo.EvaluationNumberVO;
|
||||
import cn.lili.modules.member.entity.vo.MemberEvaluationListVO;
|
||||
@ -42,12 +40,12 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@ -61,6 +59,9 @@ import java.util.Map;
|
||||
@Transactional
|
||||
public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMapper, MemberEvaluation> implements MemberEvaluationService {
|
||||
|
||||
//会员评价数据层
|
||||
@Resource
|
||||
private MemberEvaluationMapper memberEvaluationMapper;
|
||||
//订单
|
||||
@Autowired
|
||||
private OrderService orderService;
|
||||
@ -81,19 +82,14 @@ public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMap
|
||||
private RocketmqCustomProperties rocketmqCustomProperties;
|
||||
|
||||
@Override
|
||||
public IPage<MemberEvaluation> queryByParams(EvaluationQueryParams queryParams) {
|
||||
public IPage<MemberEvaluation> managerQuery(EvaluationQueryParams queryParams) {
|
||||
//获取评价分页
|
||||
return this.page(PageUtil.initPage(queryParams), queryParams.queryWrapper());
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<MemberEvaluationListVO> queryByParams(StoreEvaluationQueryParams storeEvaluationQueryParams) {
|
||||
return this.baseMapper.getMemberEvaluationList(PageUtil.initPage(storeEvaluationQueryParams), storeEvaluationQueryParams.queryWrapper());
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<MemberEvaluationListVO> queryPage(EvaluationQueryParams evaluationQueryParams, PageVO page) {
|
||||
return this.baseMapper.getMemberEvaluationList(PageUtil.initPage(page), evaluationQueryParams.queryWrapper());
|
||||
public IPage<MemberEvaluationListVO> queryPage(EvaluationQueryParams evaluationQueryParams) {
|
||||
return memberEvaluationMapper.getMemberEvaluationList(PageUtil.initPage(evaluationQueryParams), evaluationQueryParams.queryWrapper());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -103,7 +99,7 @@ public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMap
|
||||
//获取订单信息
|
||||
Order order = orderService.getBySn(orderItem.getOrderSn());
|
||||
//检测是否可以添加会员评价
|
||||
checkMemberEvaluation(orderItem,order);
|
||||
checkMemberEvaluation(orderItem, order);
|
||||
//获取用户信息
|
||||
Member member = memberService.getUserInfo();
|
||||
//获取商品信息
|
||||
@ -162,6 +158,7 @@ public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMap
|
||||
EvaluationNumberVO evaluationNumberVO = new EvaluationNumberVO();
|
||||
List<Map<String, Object>> list = this.baseMapper.getEvaluationNumber(goodsId);
|
||||
|
||||
|
||||
Integer good = 0;
|
||||
Integer moderate = 0;
|
||||
Integer worse = 0;
|
||||
@ -201,10 +198,11 @@ public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMap
|
||||
|
||||
/**
|
||||
* 检测会员评价
|
||||
*
|
||||
* @param orderItem 子订单
|
||||
* @param order 订单
|
||||
* @param order 订单
|
||||
*/
|
||||
public void checkMemberEvaluation(OrderItem orderItem,Order order){
|
||||
public void checkMemberEvaluation(OrderItem orderItem, Order order) {
|
||||
|
||||
//根据子订单编号判断是否评价过
|
||||
if (orderItem.getCommentStatus().equals(CommentStatusEnum.FINISHED.name())) {
|
||||
|
@ -4,6 +4,15 @@ import cn.hutool.json.JSONUtil;
|
||||
import cn.lili.base.BaseEntity;
|
||||
import cn.lili.common.utils.BeanUtil;
|
||||
import cn.lili.modules.base.entity.enums.ClientTypeEnum;
|
||||
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
|
||||
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
|
||||
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
|
||||
import cn.lili.modules.order.order.entity.enums.DeliverStatusEnum;
|
||||
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
|
||||
import cn.lili.modules.order.order.entity.enums.OrderTypeEnum;
|
||||
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
|
||||
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
||||
import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum;
|
||||
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
||||
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
|
||||
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
|
||||
@ -21,6 +30,7 @@ import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Table;
|
||||
import java.util.Date;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 订单
|
||||
@ -205,17 +215,29 @@ public class Order extends BaseEntity {
|
||||
* @param tradeDTO 交易DTO
|
||||
*/
|
||||
public Order(CartVO cartVO, TradeDTO tradeDTO) {
|
||||
String orderId = this.getId();
|
||||
String oldId = this.getId();
|
||||
BeanUtil.copyProperties(tradeDTO, this);
|
||||
BeanUtil.copyProperties(cartVO.getPriceDetailDTO(), this);
|
||||
BeanUtil.copyProperties(cartVO, this);
|
||||
|
||||
//订单类型判断--普通订单,活动订单。
|
||||
if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.CART) || tradeDTO.getCartTypeEnum().equals(CartTypeEnum.BUY_NOW)) {
|
||||
this.setOrderType(OrderTypeEnum.NORMAL.name());
|
||||
} else {
|
||||
this.setOrderType(tradeDTO.getCartTypeEnum().name());
|
||||
}
|
||||
this.setId(oldId);
|
||||
this.setOrderType(OrderTypeEnum.NORMAL.name());
|
||||
//促销信息填充
|
||||
if (cartVO.getSkuList().get(0).getPromotions() != null && tradeDTO.getCartTypeEnum().equals(CartTypeEnum.PINTUAN)) {
|
||||
Optional<String> pintuanId = cartVO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst();
|
||||
if (pintuanId.isPresent()) {
|
||||
promotionId = pintuanId.get();
|
||||
this.setOrderType(OrderTypeEnum.PINTUAN.name());
|
||||
if (tradeDTO.getParentOrderSn() == null) {
|
||||
this.setParentOrderSn("");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//设置默认支付状态
|
||||
this.setOrderStatus(OrderStatusEnum.UNPAID.name());
|
||||
@ -245,7 +267,12 @@ public class Order extends BaseEntity {
|
||||
}
|
||||
|
||||
public PriceDetailDTO getPriceDetailDTO() {
|
||||
return JSONUtil.toBean(priceDetail, PriceDetailDTO.class);
|
||||
|
||||
try {
|
||||
return JSONUtil.toBean(priceDetail, PriceDetailDTO.class);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void setPriceDetailDTO(PriceDetailDTO priceDetail) {
|
||||
|
@ -13,8 +13,17 @@ public enum OrderTypeEnum {
|
||||
*/
|
||||
NORMAL,
|
||||
|
||||
/**
|
||||
* 赠品订单
|
||||
*/
|
||||
GIFT,
|
||||
|
||||
/**
|
||||
* 虚拟订单
|
||||
*/
|
||||
VIRTUAL;
|
||||
VIRTUAL,
|
||||
/**
|
||||
* 拼团订单
|
||||
*/
|
||||
PINTUAN
|
||||
}
|
||||
|
@ -129,38 +129,43 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
public void intoDB(TradeDTO tradeDTO) {
|
||||
//检查TradeDTO信息
|
||||
checkTradeDTO(tradeDTO);
|
||||
//订单列表
|
||||
//存放购物车,即业务中的订单
|
||||
List<Order> orders = new ArrayList<>(tradeDTO.getCartList().size());
|
||||
//订单日志
|
||||
List<OrderLog> orderLogs = new ArrayList<>(tradeDTO.getCartList().size());
|
||||
//订单VO列表
|
||||
List<OrderVO> OrderVOList = new ArrayList<>(tradeDTO.getCartList().size());
|
||||
//订单货物列表
|
||||
//存放自订单/订单日志
|
||||
List<OrderItem> orderItems = new ArrayList<>();
|
||||
//循环交易货物列表,新增订单
|
||||
List<OrderLog> orderLogs = new ArrayList<>();
|
||||
//拼团判定,不能参与自己创建的拼团
|
||||
if (tradeDTO.getParentOrderSn() != null) {
|
||||
Order parentOrder = this.getBySn(tradeDTO.getParentOrderSn());
|
||||
if (parentOrder.getMemberId().equals(UserContext.getCurrentUser().getId())) {
|
||||
throw new ServiceException("不能参与自己发起的拼团活动!");
|
||||
}
|
||||
}
|
||||
//订单集合
|
||||
List<OrderVO> orderVOS = new ArrayList<>();
|
||||
//循环购物车商品集合
|
||||
tradeDTO.getCartList().forEach(item -> {
|
||||
//构建订单
|
||||
Order order = new Order(item, tradeDTO);
|
||||
//检查订单信息
|
||||
checkOrder(order);
|
||||
//新建订单
|
||||
if (OrderTypeEnum.PINTUAN.name().equals(order.getOrderType())) {
|
||||
Pintuan pintuan = pintuanService.getPintuanById(order.getPromotionId());
|
||||
Integer limitNum = pintuan.getLimitNum();
|
||||
if (limitNum != 0 && order.getGoodsNum() > limitNum) {
|
||||
throw new ServiceException("购买数量超过拼团活动限制数量");
|
||||
}
|
||||
}
|
||||
//构建orderVO对象
|
||||
OrderVO orderVO = new OrderVO();
|
||||
BeanUtil.copyProperties(order, orderVO);
|
||||
orders.add(order);
|
||||
//记录订单日志
|
||||
orderLogs.add(new OrderLog(item.getSn(),
|
||||
UserContext.getCurrentUser().getId(),
|
||||
UserContext.getCurrentUser().getRole().getRole(),
|
||||
UserContext.getCurrentUser().getUsername(), "订单[" + item.getSn() + "]创建"));
|
||||
|
||||
//添加订单货物
|
||||
String message = "订单[" + item.getSn() + "]创建";
|
||||
orderLogs.add(new OrderLog(item.getSn(), UserContext.getCurrentUser().getId(), UserContext.getCurrentUser().getRole().getRole(), UserContext.getCurrentUser().getUsername(), message));
|
||||
item.getSkuList().forEach(
|
||||
sku -> orderItems.add(new OrderItem(sku, item, tradeDTO))
|
||||
);
|
||||
|
||||
//构建orderVO对象
|
||||
OrderVO orderVO = new OrderVO(order, orderItems);
|
||||
OrderVOList.add(orderVO);
|
||||
orderVO.setOrderItems(orderItems);
|
||||
orderVOS.add(orderVO);
|
||||
});
|
||||
tradeDTO.setOrderVO(OrderVOList);
|
||||
tradeDTO.setOrderVO(orderVOS);
|
||||
//批量保存订单
|
||||
this.saveBatch(orders);
|
||||
//批量保存 子订单
|
||||
@ -168,7 +173,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
// 批量记录订单操作日志
|
||||
orderLogService.saveBatch(orderLogs);
|
||||
// 赠品根据店铺单独生成订单
|
||||
//todo 优化赠品订单代码逻辑
|
||||
this.generatorGiftOrder(tradeDTO);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
package cn.lili.modules.payment.kit.params.dto;
|
||||
|
||||
import cn.lili.common.utils.StringUtils;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
@ -41,4 +42,11 @@ public class CashierParam {
|
||||
|
||||
@ApiModelProperty(value = "剩余余额")
|
||||
private Double walletValue;
|
||||
|
||||
public String getDetail() {
|
||||
if (StringUtils.isEmpty(detail)) {
|
||||
return "清单详细";
|
||||
}
|
||||
return StringUtils.filterSpecialChart(detail);
|
||||
}
|
||||
}
|
||||
|
@ -4,8 +4,9 @@ import cn.hutool.core.net.URLDecoder;
|
||||
import cn.hutool.core.net.URLEncoder;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.lili.common.enums.ResultCode;
|
||||
import cn.lili.common.exception.ServiceException;
|
||||
import cn.lili.common.enums.ResultUtil;
|
||||
import cn.lili.common.exception.ServiceException;
|
||||
import cn.lili.common.utils.BeanUtil;
|
||||
import cn.lili.common.utils.SnowFlake;
|
||||
import cn.lili.common.utils.StringUtils;
|
||||
import cn.lili.common.vo.ResultMessage;
|
||||
@ -63,11 +64,9 @@ public class AliPayPlugin implements Payment {
|
||||
@Autowired
|
||||
private ApiProperties apiProperties;
|
||||
|
||||
|
||||
@Override
|
||||
public ResultMessage<Object> h5pay(HttpServletRequest request, HttpServletResponse response, PayParam payParam) {
|
||||
|
||||
|
||||
CashierParam cashierParam = cashierSupport.cashierParam(payParam);
|
||||
//请求订单编号
|
||||
String outTradeNo = SnowFlake.getIdStr();
|
||||
@ -77,12 +76,13 @@ public class AliPayPlugin implements Payment {
|
||||
payModel.setSubject(cashierParam.getDetail());
|
||||
payModel.setTotalAmount(cashierParam.getPrice() + "");
|
||||
//回传数据
|
||||
payModel.setPassbackParams(URLEncoder.createAll().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8));
|
||||
payModel.setPassbackParams(URLEncoder.createAll().encode(BeanUtil.formatKeyValuePair(payParam), StandardCharsets.UTF_8));
|
||||
//3分钟超时
|
||||
payModel.setTimeoutExpress("3m");
|
||||
payModel.setOutTradeNo(outTradeNo);
|
||||
payModel.setProductCode("QUICK_WAP_PAY");
|
||||
try {
|
||||
log.info("支付宝H5支付:{}", JSONUtil.toJsonStr(payModel));
|
||||
AliPayRequest.wapPay(response, payModel, callbackUrl(apiProperties.getBuyer(), PaymentMethodEnum.ALIPAY),
|
||||
notifyUrl(apiProperties.getBuyer(), PaymentMethodEnum.ALIPAY));
|
||||
} catch (Exception e) {
|
||||
@ -115,11 +115,13 @@ public class AliPayPlugin implements Payment {
|
||||
//3分钟超时
|
||||
payModel.setTimeoutExpress("3m");
|
||||
//回传数据
|
||||
payModel.setPassbackParams(URLEncoder.createAll().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8));
|
||||
payModel.setPassbackParams(URLEncoder.createAll().encode(BeanUtil.formatKeyValuePair(payParam), StandardCharsets.UTF_8));
|
||||
payModel.setOutTradeNo(outTradeNo);
|
||||
payModel.setProductCode("QUICK_MSECURITY_PAY");
|
||||
|
||||
log.info("支付宝APP支付:{}", payModel);
|
||||
String orderInfo = AliPayRequest.appPayToResponse(payModel, notifyUrl(apiProperties.getBuyer(), PaymentMethodEnum.ALIPAY)).getBody();
|
||||
log.info("支付宝APP支付返回内容:{}", orderInfo);
|
||||
return ResultUtil.data(orderInfo);
|
||||
} catch (AlipayApiException e) {
|
||||
log.error("支付宝支付异常:", e);
|
||||
@ -146,12 +148,14 @@ public class AliPayPlugin implements Payment {
|
||||
payModel.setTotalAmount(cashierParam.getPrice() + "");
|
||||
|
||||
//回传数据
|
||||
payModel.setPassbackParams(URLEncoder.createAll().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8));
|
||||
payModel.setPassbackParams(URLEncoder.createAll().encode(BeanUtil.formatKeyValuePair(payParam), StandardCharsets.UTF_8));
|
||||
// payModel.setStoreId("store_id");
|
||||
payModel.setTimeoutExpress("3m");
|
||||
payModel.setOutTradeNo(outTradeNo);
|
||||
|
||||
log.info("支付宝扫码:{}", payModel);
|
||||
String resultStr = AliPayRequest.tradePrecreatePayToResponse(payModel, notifyUrl(apiProperties.getBuyer(), PaymentMethodEnum.ALIPAY)).getBody();
|
||||
|
||||
log.info("支付宝扫码交互返回:{}", resultStr);
|
||||
JSONObject jsonObject = JSONObject.parseObject(resultStr);
|
||||
return ResultUtil.data(jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code"));
|
||||
} catch (Exception e) {
|
||||
@ -212,7 +216,7 @@ public class AliPayPlugin implements Payment {
|
||||
}
|
||||
refundLogService.save(refundLog);
|
||||
} catch (Exception e) {
|
||||
log.error("支付宝退款异常",e);
|
||||
log.error("支付宝退款异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -249,7 +253,7 @@ public class AliPayPlugin implements Payment {
|
||||
|
||||
String payParamStr = map.get("passback_params");
|
||||
String payParamJson = URLDecoder.decode(payParamStr, StandardCharsets.UTF_8);
|
||||
PayParam payParam = JSONUtil.toBean(payParamJson, PayParam.class);
|
||||
PayParam payParam = BeanUtil.formatKeyValuePair(payParamJson, new PayParam());
|
||||
|
||||
|
||||
if (verifyResult) {
|
||||
|
@ -13,6 +13,7 @@ import com.alipay.api.request.AlipayTradePrecreateRequest;
|
||||
import com.alipay.api.request.AlipayTradeWapPayRequest;
|
||||
import com.alipay.api.response.AlipayTradeAppPayResponse;
|
||||
import com.alipay.api.response.AlipayTradePrecreateResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
@ -24,7 +25,7 @@ import java.io.PrintWriter;
|
||||
* @author Chopper
|
||||
* @date 2020/12/15 19:26
|
||||
*/
|
||||
|
||||
@Slf4j
|
||||
public class AliPayRequest {
|
||||
|
||||
/**
|
||||
@ -40,7 +41,7 @@ public class AliPayRequest {
|
||||
public static void wapPay(HttpServletResponse response, AlipayTradeWapPayModel model, String returnUrl, String notifyUrl) throws AlipayApiException, IOException {
|
||||
String form = wapPayStr(model, returnUrl, notifyUrl);
|
||||
response.setContentType("text/html;charset=UTF-8");
|
||||
|
||||
log.info("支付表单{}", form);
|
||||
PrintWriter out = response.getWriter();
|
||||
out.write(form);
|
||||
out.flush();
|
||||
|
@ -1,2 +0,0 @@
|
||||
package cn.lili.modules.payment.kit.plugin.wechat.model;
|
||||
//这个目录的很多类的属性都是下划线分割,不符合本产品的驼峰类型约定,后续会进行处理
|
@ -0,0 +1,5 @@
|
||||
/**
|
||||
* 项目部分参考 IJPay
|
||||
* git地址 https://gitee.com/javen205/IJPay
|
||||
*/
|
||||
package cn.lili.modules.payment;
|
@ -28,14 +28,14 @@ public class CouponActivity extends BasePromotion {
|
||||
* @see CouponActivityTypeEnum
|
||||
*/
|
||||
@NotNull(message = "优惠券活动类型不能为空")
|
||||
@ApiModelProperty(value = "优惠券活动类型")
|
||||
@ApiModelProperty(value = "优惠券活动类型", allowableValues = "REGISTERED:新人赠券,SPECIFY:精确发券")
|
||||
private String couponActivityType;
|
||||
|
||||
@NotNull(message = "请选择活动范围")
|
||||
@ApiModelProperty(value = "活动范围", allowableValues = "ALL:全部会员,DESIGNATED:指定会员")
|
||||
private String activityScope;
|
||||
|
||||
@ApiModelProperty(value = "活动范围详情")
|
||||
@ApiModelProperty(value = "活动范围详情,只有精准发券使用")
|
||||
private String activityScopeInfo;
|
||||
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package cn.lili.modules.promotion.entity.vos;
|
||||
|
||||
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
/**
|
||||
* 优惠券活动的优惠券VO
|
||||
*
|
||||
* @author Bulbasaur
|
||||
* @date: 2021/6/18 11:00 上午
|
||||
*/
|
||||
public class CouponActivityItemVO extends CouponActivityItem {
|
||||
|
||||
@ApiModelProperty(value = "优惠券名称")
|
||||
private String couponName;
|
||||
|
||||
@ApiModelProperty(value = "面额")
|
||||
private Double price;
|
||||
|
||||
/**
|
||||
* POINT("打折"), PRICE("减免现金");
|
||||
*
|
||||
* @see cn.lili.modules.promotion.entity.enums.CouponTypeEnum
|
||||
*/
|
||||
@ApiModelProperty(value = "优惠券类型")
|
||||
private String couponType;
|
||||
|
||||
@ApiModelProperty(value = "折扣")
|
||||
private Double couponDiscount;
|
||||
}
|
@ -20,9 +20,9 @@ import java.util.List;
|
||||
public class CouponActivityVO extends CouponActivity {
|
||||
|
||||
@ApiModelProperty(value = "优惠券活动下的优惠券列表")
|
||||
private List<CouponActivityItem> couponActivityItems;
|
||||
private List<CouponActivityItemVO> couponActivityItems;
|
||||
|
||||
public CouponActivityVO(CouponActivity couponActivity, List<CouponActivityItem> couponActivityItems) {
|
||||
public CouponActivityVO(CouponActivity couponActivity, List<CouponActivityItemVO> couponActivityItemVOS) {
|
||||
BeanUtil.copyProperties(couponActivity, this);
|
||||
this.couponActivityItems = couponActivityItems;
|
||||
}
|
||||
|
@ -1,7 +1,12 @@
|
||||
package cn.lili.modules.promotion.mapper;
|
||||
|
||||
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
|
||||
import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import org.apache.ibatis.annotations.Update;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 优惠券活动
|
||||
@ -11,5 +16,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
*/
|
||||
public interface CouponActivityItemMapper extends BaseMapper<CouponActivityItem> {
|
||||
|
||||
|
||||
@Select("SELECT cai.*,c.coupon_name,c.price,c.coupon_type,c.coupon_discount FROM li_coupon_activity_item cai INNER JOIN li_coupon c ON cai.coupon_id = c.id WHERE cai.activity_id= #{activityId} ")
|
||||
List<CouponActivityItemVO> getCouponActivityItemListVO(String activityId);
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package cn.lili.modules.promotion.service;
|
||||
|
||||
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
|
||||
import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
@ -20,4 +21,11 @@ public interface CouponActivityItemService extends IService<CouponActivityItem>
|
||||
* @return 优惠券关联优惠券列表
|
||||
*/
|
||||
List<CouponActivityItem> getCouponActivityList(String activityId);
|
||||
/**
|
||||
* 获取优惠券活动关联优惠券列表VO
|
||||
*
|
||||
* @param activityId 优惠券活动ID
|
||||
* @return 优惠券关联优惠券列表
|
||||
*/
|
||||
List<CouponActivityItemVO> getCouponActivityItemListVO(String activityId);
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package cn.lili.modules.promotion.serviceimpl;
|
||||
|
||||
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
|
||||
import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO;
|
||||
import cn.lili.modules.promotion.mapper.CouponActivityItemMapper;
|
||||
import cn.lili.modules.promotion.service.CouponActivityItemService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
@ -17,10 +18,17 @@ import java.util.List;
|
||||
*/
|
||||
@Service
|
||||
public class CouponActivityItemServiceImpl extends ServiceImpl<CouponActivityItemMapper, CouponActivityItem> implements CouponActivityItemService {
|
||||
|
||||
@Override
|
||||
public List<CouponActivityItem> getCouponActivityList(String activityId) {
|
||||
LambdaQueryWrapper<CouponActivityItem> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
lambdaQueryWrapper.eq(CouponActivityItem::getActivityId, activityId);
|
||||
return this.list(lambdaQueryWrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CouponActivityItemVO> getCouponActivityItemListVO(String activityId) {
|
||||
return this.baseMapper.getCouponActivityItemListVO(activityId);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -79,7 +79,7 @@ public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper,
|
||||
@Override
|
||||
public CouponActivityVO getCouponActivityVO(String couponActivityId) {
|
||||
CouponActivity couponActivity = this.getById(couponActivityId);
|
||||
CouponActivityVO couponActivityVO = new CouponActivityVO(couponActivity, couponActivityItemService.getCouponActivityList(couponActivityId));
|
||||
CouponActivityVO couponActivityVO = new CouponActivityVO(couponActivity, couponActivityItemService.getCouponActivityItemListVO(couponActivityId));
|
||||
return couponActivityVO;
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,7 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* 商品索引
|
||||
*
|
||||
* @author paulG
|
||||
* @date 2020/10/13
|
||||
**/
|
||||
@ -248,35 +249,6 @@ public class EsGoodsIndex implements Serializable {
|
||||
private Map<String, Object> promotionMap;
|
||||
|
||||
|
||||
public void setGoodsSku(GoodsSku sku) {
|
||||
if (sku != null) {
|
||||
this.id = sku.getId();
|
||||
this.goodsId = sku.getGoodsId();
|
||||
this.goodsName = sku.getGoodsName();
|
||||
this.price = sku.getPrice();
|
||||
this.storeName = sku.getStoreName();
|
||||
this.storeId = sku.getStoreId();
|
||||
this.thumbnail = sku.getThumbnail();
|
||||
this.categoryPath = sku.getCategoryPath();
|
||||
this.goodsVideo = sku.getGoodsVideo();
|
||||
this.mobileIntro = sku.getMobileIntro();
|
||||
this.buyCount = sku.getBuyCount();
|
||||
this.commentNum = sku.getCommentNum();
|
||||
this.small = sku.getSmall();
|
||||
this.brandId = sku.getBrandId();
|
||||
this.sn = sku.getSn();
|
||||
this.storeCategoryPath = sku.getStoreCategoryPath();
|
||||
this.sellingPoint = sku.getSellingPoint();
|
||||
this.selfOperated = sku.getSelfOperated();
|
||||
this.salesModel = sku.getSalesModel();
|
||||
this.marketEnable = sku.getMarketEnable();
|
||||
this.isAuth = sku.getIsAuth();
|
||||
this.intro = sku.getIntro();
|
||||
this.grade = sku.getGrade();
|
||||
this.releaseTime = new Date();
|
||||
}
|
||||
}
|
||||
|
||||
public EsGoodsIndex(GoodsSku sku) {
|
||||
if (sku != null) {
|
||||
this.id = sku.getId();
|
||||
@ -320,4 +292,33 @@ public class EsGoodsIndex implements Serializable {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void setGoodsSku(GoodsSku sku) {
|
||||
if (sku != null) {
|
||||
this.id = sku.getId();
|
||||
this.goodsId = sku.getGoodsId();
|
||||
this.goodsName = sku.getGoodsName();
|
||||
this.price = sku.getPrice();
|
||||
this.storeName = sku.getStoreName();
|
||||
this.storeId = sku.getStoreId();
|
||||
this.thumbnail = sku.getThumbnail();
|
||||
this.categoryPath = sku.getCategoryPath();
|
||||
this.goodsVideo = sku.getGoodsVideo();
|
||||
this.mobileIntro = sku.getMobileIntro();
|
||||
this.buyCount = sku.getBuyCount();
|
||||
this.commentNum = sku.getCommentNum();
|
||||
this.small = sku.getSmall();
|
||||
this.brandId = sku.getBrandId();
|
||||
this.sn = sku.getSn();
|
||||
this.storeCategoryPath = sku.getStoreCategoryPath();
|
||||
this.sellingPoint = sku.getSellingPoint();
|
||||
this.selfOperated = sku.getSelfOperated();
|
||||
this.salesModel = sku.getSalesModel();
|
||||
this.marketEnable = sku.getMarketEnable();
|
||||
this.isAuth = sku.getIsAuth();
|
||||
this.intro = sku.getIntro();
|
||||
this.grade = sku.getGrade();
|
||||
this.releaseTime = new Date();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,735 +0,0 @@
|
||||
<template>
|
||||
<div class="search">
|
||||
<Row>
|
||||
<Col>
|
||||
<Card>
|
||||
<%
|
||||
if(searchSize>0&&!hideSearch){
|
||||
%>
|
||||
<Row <% if(searchSize>0){ %>v-show="openSearch"<% } %> @keydown.enter.native="handleSearch">
|
||||
<Form ref="searchForm" :model="searchForm" inline :label-width="70">
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.searchable){
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="text"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<Input type="text" v-model="searchForm.${item.field}" placeholder="请输入${item.name}" clearable style="width: 200px"/>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="select"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<Select v-model="searchForm.${item.field}" placeholder="请选择" clearable style="width: 200px">
|
||||
<Option value="0">请自行编辑下拉菜单</Option>
|
||||
</Select>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="date"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<DatePicker type="date" v-model="searchForm.${item.field}" placeholder="请选择" readonly clearable style="width: 200px"></DatePicker>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="daterange"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<DatePicker v-model="selectDate" type="daterange" format="yyyy-MM-dd" clearable @on-change="selectDateRange" placeholder="选择起始时间" readonly style="width: 200px"></DatePicker>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="area"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<al-cascader v-model="searchForm.${item.field}" data-type="code" level="${item.searchLevel}" style="width:200px"/>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
<Form-item style="margin-left:-35px;" class="br">
|
||||
<Button @click="handleSearch" type="primary" icon="ios-search">搜索</Button>
|
||||
<Button @click="handleReset">重置</Button>
|
||||
</Form-item>
|
||||
</Form>
|
||||
</Row>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(searchSize>0&&hideSearch){
|
||||
%>
|
||||
<Row @keydown.enter.native="handleSearch">
|
||||
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
|
||||
<%
|
||||
for(item in firstTwo){
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="text"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<Input type="text" v-model="searchForm.${item.field}" placeholder="请输入${item.name}" clearable style="width: 200px"/>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="select"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<Select v-model="searchForm.${item.field}" placeholder="请选择" clearable style="width: 200px">
|
||||
<Option value="0">请自行编辑下拉菜单</Option>
|
||||
</Select>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="date"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<DatePicker type="date" v-model="searchForm.${item.field}" placeholder="请选择" readonly clearable style="width: 200px"></DatePicker>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="daterange"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<DatePicker v-model="selectDate" type="daterange" format="yyyy-MM-dd" clearable @on-change="selectDateRange" readonly placeholder="选择起始时间" style="width: 200px"></DatePicker>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="area"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<al-cascader v-model="searchForm.${item.field}" data-type="code" level="${item.searchLevel}" style="width:200px"/>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<span v-if="drop">
|
||||
<%
|
||||
for(item in rest){
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="text"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<Input type="text" v-model="searchForm.${item.field}" placeholder="请输入${item.name}" clearable style="width: 200px"/>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="select"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<Select v-model="searchForm.${item.field}" placeholder="请选择" clearable style="width: 200px">
|
||||
<Option value="0">请自行编辑下拉菜单</Option>
|
||||
</Select>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="date"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<DatePicker type="date" v-model="searchForm.${item.field}" placeholder="请选择" clearable style="width: 200px" readonly format="yyyy-MM-dd HH:mm:ss"></DatePicker>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="daterange"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<DatePicker v-model="selectDate" type="daterange" format="yyyy-MM-dd" clearable @on-change="selectDateRange" placeholder="选择起始时间" readonly style="width: 200px"></DatePicker>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.searchType=="area"){
|
||||
%>
|
||||
<Form-item label="${item.name}" prop="${item.field}">
|
||||
<al-cascader v-model="searchForm.${item.field}" data-type="code" level="${item.searchLevel}" style="width:200px"/>
|
||||
</Form-item>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
</span>
|
||||
<Form-item style="margin-left:-35px;" class="br">
|
||||
<Button @click="handleSearch" type="primary" icon="ios-search">搜索</Button>
|
||||
<Button @click="handleReset">重置</Button>
|
||||
<a class="drop-down" @click="dropDown">
|
||||
{{dropDownContent}}
|
||||
<Icon :type="dropDownIcon"></Icon>
|
||||
</a>
|
||||
</Form-item>
|
||||
</Form>
|
||||
</Row>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<Row class="operation">
|
||||
<Button @click="add" type="primary" icon="md-add">添加</Button>
|
||||
<Button @click="delAll" icon="md-trash">批量删除</Button>
|
||||
<Button @click="getDataList" icon="md-refresh">刷新</Button>
|
||||
<% if(searchSize>0){ %>
|
||||
<Button type="dashed" @click="openSearch=!openSearch">{{openSearch ? "关闭搜索" : "开启搜索"}}</Button>
|
||||
<% } %>
|
||||
<Button type="dashed" @click="openTip=!openTip">{{openTip ? "关闭提示" : "开启提示"}}</Button>
|
||||
</Row>
|
||||
<Row v-show="openTip">
|
||||
<Alert show-icon>
|
||||
已选择 <span class="select-count">{{selectCount}}</span> 项
|
||||
<a class="select-clear" @click="clearSelectAll">清空</a>
|
||||
</Alert>
|
||||
</Row>
|
||||
<Row>
|
||||
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-sort-change="changeSort" @on-selection-change="changeSelect"></Table>
|
||||
</Row>
|
||||
<Row type="flex" justify="end" class="page">
|
||||
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10,20,50]" size="small" show-total show-elevator show-sizer></Page>
|
||||
</Row>
|
||||
</Card>
|
||||
</Col>
|
||||
</Row>
|
||||
<Modal :title="modalTitle" v-model="modalVisible" :mask-closable='false' :width="${modalWidth}">
|
||||
<Form ref="form" :model="form" :label-width="100" :rules="formValidate" <% if(rowNum>1){ %>inline<% } %>>
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.editable){
|
||||
%>
|
||||
<FormItem label="${item.name}" prop="${item.field}" <% if(rowNum>1&&(item.type=="switch"||item.type=="radio")){ %>style="width:${itemWidth}"<% } %>>
|
||||
<%
|
||||
if(item.type=="text"){
|
||||
%>
|
||||
<Input v-model="form.${item.field}" clearable style="width:${width}"/>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="select"){
|
||||
%>
|
||||
<Select v-model="form.${item.field}" clearable style="width:${width}">
|
||||
<Option value="0">请自行编辑下拉菜单</Option>
|
||||
</Select>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="switch"){
|
||||
%>
|
||||
<i-switch v-model="form.${item.field}"></i-switch>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="radio"){
|
||||
%>
|
||||
<RadioGroup v-model="form.${item.field}">
|
||||
<Radio label="0">请自行编辑单选框</Radio>
|
||||
<Radio label="1">请自行编辑单选框</Radio>
|
||||
</RadioGroup>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="number"){
|
||||
%>
|
||||
<InputNumber v-model="form.${item.field}" style="width:${width}"></InputNumber>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="date"){
|
||||
%>
|
||||
<DatePicker type="date" v-model="form.${item.field}" readonly clearable style="width:${width}"></DatePicker>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="daterange"){
|
||||
%>
|
||||
<DatePicker type="daterange" v-model="form.${item.field}" readonly clearable style="width:${width}"></DatePicker>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="time"){
|
||||
%>
|
||||
<TimePicker type="time" v-model="form.${item.field}" clearable style="width:${width}"></TimePicker>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="area"){
|
||||
%>
|
||||
<al-cascader v-model="form.${item.field}" data-type="code" level="${item.level}" style="width:${width}"/>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="slider"){
|
||||
%>
|
||||
<Slider v-model="form.${item.field}" style="width:${width}"></Slider>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="upload"){
|
||||
%>
|
||||
<upload-pic-input v-model="form.${item.field}" style="width:${width}"></upload-pic-input>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
</FormItem>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
</Form>
|
||||
<div slot="footer">
|
||||
<Button type="text" @click="modalVisible=false">取消</Button>
|
||||
<Button type="primary" :loading="submitLoading" @click="handleSubmit">提交</Button>
|
||||
</div>
|
||||
</Modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<%
|
||||
if(upload){
|
||||
%>
|
||||
import uploadPicInput from "@/views/my-components/lili/upload-pic-input";
|
||||
<%
|
||||
}
|
||||
%>
|
||||
export default {
|
||||
name: "${vueName}",
|
||||
components: {
|
||||
<%
|
||||
if(upload){
|
||||
%>
|
||||
uploadPicInput
|
||||
<%
|
||||
}
|
||||
%>
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
<% if(searchSize>0){ %>
|
||||
openSearch: true, // 显示搜索
|
||||
<% }%>
|
||||
openTip: true, // 显示提示
|
||||
loading: true, // 表单加载状态
|
||||
modalType: 0, // 添加或编辑标识
|
||||
modalVisible: false, // 添加或编辑显示
|
||||
modalTitle: "", // 添加或编辑标题
|
||||
<% if(hideSearch) { %>
|
||||
drop: false,
|
||||
dropDownContent: "展开",
|
||||
dropDownIcon: "ios-arrow-down",
|
||||
<% } %>
|
||||
searchForm: { // 搜索框初始化对象
|
||||
pageNumber: 1, // 当前页数
|
||||
pageSize: 10, // 页面大小
|
||||
sort: "createTime", // 默认排序字段
|
||||
order: "desc", // 默认排序方式
|
||||
<% if(daterangeSearch){ %>
|
||||
startDate: "", // 起始时间
|
||||
endDate: "" // 终止时间
|
||||
<% } %>
|
||||
},
|
||||
<% if(daterangeSearch){ %>
|
||||
selectDate: null,
|
||||
<% } %>
|
||||
form: { // 添加或编辑表单对象初始化数据
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.editable){
|
||||
%>
|
||||
<% if(item.type=="switch"){ %>
|
||||
${item.field}: true,
|
||||
<% }else if(item.type=="number"||item.type=="slider"){ %>
|
||||
${item.field}: 0,
|
||||
<% }else if(item.type=="area"){ %>
|
||||
${item.field}: [],
|
||||
<% }else{ %>
|
||||
${item.field}: "",
|
||||
<% } %>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
},
|
||||
// 表单验证规则
|
||||
formValidate: {
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.editable&&item.validate){
|
||||
%>
|
||||
<% if(item.type=="daterange"||item.type=="area"){ %>
|
||||
${item.field}: [{ type: "array", required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% }else if(item.type=="date"){ %>
|
||||
${item.field}: [{ type: "date", required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% }else if(item.type=="number"||item.type=="slider"){ %>
|
||||
${item.field}: [{ type: "number", required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% }else if(item.type=="switch"){ %>
|
||||
${item.field}: [{ type: "boolean", required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% }else{ %>
|
||||
${item.field}: [{ required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% } %>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
},
|
||||
submitLoading: false, // 添加或编辑提交状态
|
||||
selectList: [], // 多选数据
|
||||
selectCount: 0, // 多选计数
|
||||
columns: [
|
||||
// 表头
|
||||
{
|
||||
type: "selection",
|
||||
width: 60,
|
||||
align: "center"
|
||||
},
|
||||
{
|
||||
type: "index",
|
||||
width: 60,
|
||||
align: "center"
|
||||
},
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.tableShow){
|
||||
%>
|
||||
{
|
||||
title: "${item.name}",
|
||||
key: "${item.field}",
|
||||
minWidth: 120,
|
||||
<%
|
||||
if(item.sortable){
|
||||
%>
|
||||
sortable: true,
|
||||
<%
|
||||
}else{
|
||||
%>
|
||||
sortable: false,
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.defaultSort){
|
||||
%>
|
||||
sortType: "${item.defaultSortType}"
|
||||
<%
|
||||
}
|
||||
%>
|
||||
},
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
{
|
||||
title: "操作",
|
||||
key: "action",
|
||||
align: "center",
|
||||
width: 200,
|
||||
render: (h, params) => {
|
||||
return h("div", [
|
||||
h(
|
||||
"Button",
|
||||
{
|
||||
props: {
|
||||
type: "primary",
|
||||
size: "small",
|
||||
icon: "ios-create-outline"
|
||||
},
|
||||
style: {
|
||||
marginRight: "5px"
|
||||
},
|
||||
on: {
|
||||
click: () => {
|
||||
this.edit(params.row);
|
||||
}
|
||||
}
|
||||
},
|
||||
"编辑"
|
||||
),
|
||||
h(
|
||||
"Button",
|
||||
{
|
||||
props: {
|
||||
type: "error",
|
||||
size: "small",
|
||||
icon: "md-trash"
|
||||
},
|
||||
on: {
|
||||
click: () => {
|
||||
this.remove(params.row);
|
||||
}
|
||||
}
|
||||
},
|
||||
"删除"
|
||||
)
|
||||
]);
|
||||
}
|
||||
}
|
||||
],
|
||||
data: [], // 表单数据
|
||||
total: 0 // 表单数据总数
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
this.getDataList();
|
||||
},
|
||||
changePage(v) {
|
||||
this.searchForm.pageNumber = v;
|
||||
this.getDataList();
|
||||
this.clearSelectAll();
|
||||
},
|
||||
changePageSize(v) {
|
||||
this.searchForm.pageSize = v;
|
||||
this.getDataList();
|
||||
},
|
||||
handleSearch() {
|
||||
this.searchForm.pageNumber = 1;
|
||||
this.searchForm.pageSize = 10;
|
||||
this.getDataList();
|
||||
},
|
||||
handleReset() {
|
||||
this.$refs.searchForm.resetFields();
|
||||
this.searchForm.pageNumber = 1;
|
||||
this.searchForm.pageSize = 10;
|
||||
<% if(daterangeSearch){ %>
|
||||
this.selectDate = null;
|
||||
this.searchForm.startDate = "";
|
||||
this.searchForm.endDate = "";
|
||||
<% } %>
|
||||
// 重新加载数据
|
||||
this.getDataList();
|
||||
},
|
||||
changeSort(e) {
|
||||
this.searchForm.sort = e.key;
|
||||
this.searchForm.order = e.order;
|
||||
if (e.order === "normal") {
|
||||
this.searchForm.order = "";
|
||||
}
|
||||
this.getDataList();
|
||||
},
|
||||
clearSelectAll() {
|
||||
this.$refs.table.selectAll(false);
|
||||
},
|
||||
changeSelect(e) {
|
||||
this.selectList = e;
|
||||
this.selectCount = e.length;
|
||||
},
|
||||
<% if(daterangeSearch){ %>
|
||||
selectDateRange(v) {
|
||||
if (v) {
|
||||
this.searchForm.startDate = v[0];
|
||||
this.searchForm.endDate = v[1];
|
||||
}
|
||||
},
|
||||
<% } %>
|
||||
<% if(hideSearch){ %>
|
||||
dropDown() {
|
||||
if (this.drop) {
|
||||
this.dropDownContent = "展开";
|
||||
this.dropDownIcon = "ios-arrow-down";
|
||||
} else {
|
||||
this.dropDownContent = "收起";
|
||||
this.dropDownIcon = "ios-arrow-up";
|
||||
}
|
||||
this.drop = !this.drop;
|
||||
},
|
||||
<% } %>
|
||||
getDataList() {
|
||||
this.loading = true;
|
||||
// 带多条件搜索参数获取表单数据 请自行修改接口
|
||||
this.getRequest("/${vueName}/getByPage", this.searchForm).then(res => {
|
||||
this.loading = false;
|
||||
if (res.success) {
|
||||
this.data = res.result.records;
|
||||
this.total = res.result.total;
|
||||
}
|
||||
});
|
||||
// 以下为模拟数据
|
||||
//this.data = [
|
||||
//];
|
||||
this.total = this.data.length;
|
||||
this.loading = false;
|
||||
},
|
||||
handleSubmit() {
|
||||
this.$refs.form.validate(valid => {
|
||||
if (valid) {
|
||||
this.submitLoading = true;
|
||||
if (this.modalType === 0) {
|
||||
// 添加 避免编辑后传入id等数据 记得删除
|
||||
delete this.form.id;
|
||||
this.postRequest("/${vueName}/insertOrUpdate", this.form).then(res => {
|
||||
this.submitLoading = false;
|
||||
if (res.success) {
|
||||
this.$Message.success("操作成功");
|
||||
this.getDataList();
|
||||
this.modalVisible = false;
|
||||
}
|
||||
});
|
||||
// 模拟请求成功
|
||||
//this.submitLoading = false;
|
||||
//this.$Message.success("操作成功");
|
||||
//this.getDataList();
|
||||
//this.modalVisible = false;
|
||||
} else {
|
||||
// 编辑
|
||||
this.postRequest("/${vueName}/insertOrUpdate", this.form).then(res => {
|
||||
this.submitLoading = false;
|
||||
if (res.success) {
|
||||
this.$Message.success("操作成功");
|
||||
this.getDataList();
|
||||
this.modalVisible = false;
|
||||
}
|
||||
});
|
||||
// 模拟请求成功
|
||||
//this.submitLoading = false;
|
||||
//this.$Message.success("操作成功");
|
||||
//this.getDataList();
|
||||
//this.modalVisible = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
add() {
|
||||
this.modalType = 0;
|
||||
this.modalTitle = "添加";
|
||||
this.$refs.form.resetFields();
|
||||
delete this.form.id;
|
||||
this.modalVisible = true;
|
||||
},
|
||||
edit(v) {
|
||||
this.modalType = 1;
|
||||
this.modalTitle = "编辑";
|
||||
this.$refs.form.resetFields();
|
||||
// 转换null为""
|
||||
for (let attr in v) {
|
||||
if (v[attr] === null) {
|
||||
v[attr] = "";
|
||||
}
|
||||
}
|
||||
let str = JSON.stringify(v);
|
||||
let data = JSON.parse(str);
|
||||
this.form = data;
|
||||
this.modalVisible = true;
|
||||
},
|
||||
remove(v) {
|
||||
this.$Modal.confirm({
|
||||
title: "确认删除",
|
||||
// 记得确认修改此处
|
||||
content: "您确认要删除么?",
|
||||
loading: true,
|
||||
onOk: () => {
|
||||
// 删除
|
||||
this.deleteRequest("/${vueName}/delByIds/" + v.id).then(res => {
|
||||
this.$Modal.remove();
|
||||
if (res.success) {
|
||||
this.$Message.success("操作成功");
|
||||
this.getDataList();
|
||||
}
|
||||
});
|
||||
// 模拟请求成功
|
||||
//this.$Message.success("操作成功");
|
||||
//this.$Modal.remove();
|
||||
//this.getDataList();
|
||||
}
|
||||
});
|
||||
},
|
||||
delAll() {
|
||||
if (this.selectCount <= 0) {
|
||||
this.$Message.warning("您还未选择要删除的数据");
|
||||
return;
|
||||
}
|
||||
this.$Modal.confirm({
|
||||
title: "确认删除",
|
||||
content: "您确认要删除所选的 " + this.selectCount + " 条数据?",
|
||||
loading: true,
|
||||
onOk: () => {
|
||||
let ids = "";
|
||||
this.selectList.forEach(function(e) {
|
||||
ids += e.id + ",";
|
||||
});
|
||||
ids = ids.substring(0, ids.length - 1);
|
||||
// 批量删除
|
||||
this.deleteRequest("/${vueName}/delByIds/" + ids).then(res => {
|
||||
this.$Modal.remove();
|
||||
if (res.success) {
|
||||
this.$Message.success("操作成功");
|
||||
this.clearSelectAll();
|
||||
this.getDataList();
|
||||
}
|
||||
});
|
||||
// 模拟请求成功
|
||||
//this.$Message.success("操作成功");
|
||||
//this.$Modal.remove();
|
||||
//this.clearSelectAll();
|
||||
//this.getDataList();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.init();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style lang="less">
|
||||
// 建议引入通用样式 可删除下面样式代码
|
||||
// @import "../../../styles/table-common.less";
|
||||
.search {
|
||||
.operation {
|
||||
margin-bottom: 2vh;
|
||||
}
|
||||
.select-count {
|
||||
font-weight: 600;
|
||||
color: #40a9ff;
|
||||
}
|
||||
.select-clear {
|
||||
margin-left: 10px;
|
||||
}
|
||||
.page {
|
||||
margin-top: 2vh;
|
||||
}
|
||||
.drop-down {
|
||||
margin-left: 5px;
|
||||
}
|
||||
}
|
||||
</style>
|
@ -1,687 +0,0 @@
|
||||
<template>
|
||||
<div class="search">
|
||||
<Card>
|
||||
<Row class="operation">
|
||||
<Button @click="add" type="primary" icon="md-add">添加子节点</Button>
|
||||
<Button @click="addRoot" icon="md-add">添加一级节点</Button>
|
||||
<Button @click="delAll" icon="md-trash">批量删除</Button>
|
||||
<Button @click="getParentList" icon="md-refresh">刷新</Button>
|
||||
<i-switch v-model="strict" size="large" style="margin-left:5px">
|
||||
<span slot="open">级联</span>
|
||||
<span slot="close">单选</span>
|
||||
</i-switch>
|
||||
</Row>
|
||||
<Row type="flex" justify="start">
|
||||
<Col span="6">
|
||||
<Alert show-icon>
|
||||
当前选择编辑:
|
||||
<span class="select-title">{{editTitle}}</span>
|
||||
<a class="select-clear" v-if="form.id" @click="cancelEdit">取消选择</a>
|
||||
</Alert>
|
||||
<Input
|
||||
v-model="searchKey"
|
||||
suffix="ios-search"
|
||||
@on-change="search"
|
||||
placeholder="输入节点名搜索"
|
||||
clearable
|
||||
/>
|
||||
<div class="tree-bar" :style="{maxHeight: maxHeight}">
|
||||
<Tree
|
||||
ref="tree"
|
||||
:data="data"
|
||||
:load-data="loadData"
|
||||
show-checkbox
|
||||
@on-check-change="changeSelect"
|
||||
@on-select-change="selectTree"
|
||||
:check-strictly="!strict"
|
||||
></Tree>
|
||||
<Spin size="large" fix v-if="loading"></Spin>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="${span}" style="margin-left:10px">
|
||||
<Form ref="form" :model="form" :label-width="100" :rules="formValidate" <% if(rowNum>1){ %>inline<% } %>>
|
||||
<FormItem label="上级节点" prop="parentTitle">
|
||||
<div style="display:flex;">
|
||||
<Input v-model="form.parentTitle" readonly style="margin-right:10px;"/>
|
||||
<Poptip transfer trigger="click" placement="right-start" title="选择上级部门" width="250">
|
||||
<Button icon="md-list">选择部门</Button>
|
||||
<div slot="content" style="position:relative;min-height:5vh">
|
||||
<Tree :data="dataEdit" :load-data="loadData" @on-select-change="selectTreeEdit"></Tree>
|
||||
<Spin size="large" fix v-if="loadingEdit"></Spin>
|
||||
</div>
|
||||
</Poptip>
|
||||
</div>
|
||||
</FormItem>
|
||||
<FormItem label="名称" prop="title">
|
||||
<Input v-model="form.title" />
|
||||
</FormItem>
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.editable){
|
||||
%>
|
||||
<FormItem label="${item.name}" prop="${item.field}" <% if(rowNum>1&&(item.type=="switch"||item.type=="radio")){ %>style="width:${itemWidth}"<% } %>>
|
||||
<%
|
||||
if(item.type=="text"){
|
||||
%>
|
||||
<Input v-model="form.${item.field}" style="width:${editWidth}"/>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="select"){
|
||||
%>
|
||||
<Select v-model="form.${item.field}" style="width:${editWidth}">
|
||||
<Option value="0">请自行编辑下拉菜单</Option>
|
||||
</Select>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="number"){
|
||||
%>
|
||||
<InputNumber v-model="form.${item.field}" style="width:${editWidth}"></InputNumber>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="switch"){
|
||||
%>
|
||||
<i-switch v-model="form.${item.field}"></i-switch>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="radio"){
|
||||
%>
|
||||
<RadioGroup v-model="form.${item.field}">
|
||||
<Radio label="0">请自行编辑单选框</Radio>
|
||||
<Radio label="1">请自行编辑单选框</Radio>
|
||||
</RadioGroup>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="date"){
|
||||
%>
|
||||
<DatePicker type="date" v-model="form.${item.field}" style="width:${editWidth}"></DatePicker>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="daterange"){
|
||||
%>
|
||||
<DatePicker type="daterange" v-model="form.${item.field}" style="width:${editWidth}"></DatePicker>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="time"){
|
||||
%>
|
||||
<TimePicker type="time" v-model="form.${item.field}" style="width:${editWidth}"></TimePicker>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="area"){
|
||||
%>
|
||||
<al-cascader v-model="form.${item.field}" data-type="code" level="${item.level}" style="width:${editWidth}"/>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="slider"){
|
||||
%>
|
||||
<Slider v-model="form.${item.field}" style="width:${editWidth}"></Slider>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="upload"){
|
||||
%>
|
||||
<upload-pic-input v-model="form.${item.field}" style="width:${editWidth}"></upload-pic-input>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
</FormItem>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
<FormItem label="排序值" prop="sortOrder">
|
||||
<Poptip trigger="hover" placement="right" content="值越小越靠前,支持小数">
|
||||
<InputNumber :max="1000" :min="0" v-model="form.sortOrder"></InputNumber>
|
||||
</Poptip>
|
||||
</FormItem>
|
||||
<br>
|
||||
<Form-item>
|
||||
<Button
|
||||
@click="submitEdit"
|
||||
:loading="submitLoading"
|
||||
type="primary"
|
||||
icon="ios-create-outline"
|
||||
style="margin-right:5px"
|
||||
>修改并保存</Button>
|
||||
<Button @click="handleReset">重置</Button>
|
||||
</Form-item>
|
||||
</Form>
|
||||
</Col>
|
||||
</Row>
|
||||
</Card>
|
||||
|
||||
<Modal :title="modalTitle" v-model="modalVisible" :mask-closable="false" :width="${modalWidth}">
|
||||
<Form ref="formAdd" :model="formAdd" :label-width="100" :rules="formValidate" <% if(rowNum>1){ %>inline<% } %>>
|
||||
<div v-if="showParent">
|
||||
<FormItem label="上级节点:">{{form.title}}</FormItem>
|
||||
</div>
|
||||
<FormItem label="名称" prop="title">
|
||||
<Input v-model="form.title" />
|
||||
</FormItem>
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.editable){
|
||||
%>
|
||||
<FormItem label="${item.name}" prop="${item.field}" <% if(rowNum>1&&(item.type=="number"||item.type=="switch"||item.type=="radio")){ %>style="width:${itemWidth}"<% } %>>
|
||||
<%
|
||||
if(item.type=="text"){
|
||||
%>
|
||||
<Input v-model="formAdd.${item.field}" style="width:${width}"/>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="select"){
|
||||
%>
|
||||
<Select v-model="formAdd.${item.field}" style="width:${width}">
|
||||
<Option value="0">请自行编辑下拉菜单</Option>
|
||||
</Select>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="number"){
|
||||
%>
|
||||
<InputNumber v-model="formAdd.${item.field}"></InputNumber>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="switch"){
|
||||
%>
|
||||
<i-switch v-model="formAdd.${item.field}"></i-switch>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="radio"){
|
||||
%>
|
||||
<RadioGroup v-model="formAdd.${item.field}">
|
||||
<Radio label="0">请自行编辑单选框</Radio>
|
||||
<Radio label="1">请自行编辑单选框</Radio>
|
||||
</RadioGroup>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="date"){
|
||||
%>
|
||||
<DatePicker type="date" v-model="formAdd.${item.field}" style="width:${width}"></DatePicker>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="daterange"){
|
||||
%>
|
||||
<DatePicker type="daterange" v-model="formAdd.${item.field}" style="width:${width}"></DatePicker>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="time"){
|
||||
%>
|
||||
<TimePicker type="time" v-model="formAdd.${item.field}" style="width:${width}"></TimePicker>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="area"){
|
||||
%>
|
||||
<al-cascader v-model="formAdd.${item.field}" data-type="code" level="${item.level}" style="width:${width}"/>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="slider"){
|
||||
%>
|
||||
<Slider v-model="formAdd.${item.field}" style="width:${width}"></Slider>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
<%
|
||||
if(item.type=="upload"){
|
||||
%>
|
||||
<upload-pic-input v-model="formAdd.${item.field}" style="width:${width}"></upload-pic-input>
|
||||
<%
|
||||
}
|
||||
%>
|
||||
</FormItem>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
<FormItem label="排序值" prop="sortOrder">
|
||||
<Poptip trigger="hover" placement="right" content="值越小越靠前,支持小数">
|
||||
<InputNumber :max="1000" :min="0" v-model="formAdd.sortOrder"></InputNumber>
|
||||
</Poptip>
|
||||
</FormItem>
|
||||
</Form>
|
||||
<div slot="footer">
|
||||
<Button type="text" @click="modalVisible=false">取消</Button>
|
||||
<Button type="primary" :loading="submitLoading" @click="submitAdd">提交</Button>
|
||||
</div>
|
||||
</Modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<%
|
||||
if(upload){
|
||||
%>
|
||||
import uploadPicInput from "@/views/my-components/lili/upload-pic-input";
|
||||
<%
|
||||
}
|
||||
%>
|
||||
export default {
|
||||
name: "${vueName}",
|
||||
components: {
|
||||
<%
|
||||
if(upload){
|
||||
%>
|
||||
uploadPicInput
|
||||
<%
|
||||
}
|
||||
%>
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
maxHeight: "500px",
|
||||
strict: true,
|
||||
loading: false, // 树加载状态
|
||||
loadingEdit: false, // 编辑上级树加载状态
|
||||
modalVisible: false, // 添加显示
|
||||
selectList: [], // 多选数据
|
||||
selectCount: 0, // 多选计数
|
||||
showParent: false, // 显示上级标识
|
||||
modalTitle: "", // 添加标题
|
||||
editTitle: "", // 编辑节点名称
|
||||
searchKey: "", // 搜索树
|
||||
form: {
|
||||
// 编辑对象初始化数据
|
||||
id: "",
|
||||
title: "",
|
||||
parentId: "",
|
||||
parentTitle: "",
|
||||
sortOrder: 0,
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.editable){
|
||||
%>
|
||||
<% if(item.type=="switch"){ %>
|
||||
${item.field}: true,
|
||||
<% }else if(item.type=="number"||item.type=="slider"){ %>
|
||||
${item.field}: 0,
|
||||
<% }else if(item.type=="area"){ %>
|
||||
${item.field}: [],
|
||||
<% }else{ %>
|
||||
${item.field}: "",
|
||||
<% } %>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
},
|
||||
formAdd: {
|
||||
// 添加对象初始化数据
|
||||
},
|
||||
formValidate: {
|
||||
// 表单验证规则
|
||||
title: [{ required: true, message: "不能为空", trigger: "blur" }],
|
||||
sortOrder: [
|
||||
{
|
||||
required: true,
|
||||
type: "number",
|
||||
message: "排序值不能为空",
|
||||
trigger: "blur"
|
||||
}
|
||||
],
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.editable&&item.validate){
|
||||
%>
|
||||
<% if(item.type=="daterange"||item.type=="area"){ %>
|
||||
${item.field}: [{ type: "array", required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% }else if(item.type=="date"){ %>
|
||||
${item.field}: [{ type: "date", required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% }else if(item.type=="number"||item.type=="slider"){ %>
|
||||
${item.field}: [{ type: "number", required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% }else if(item.type=="switch"){ %>
|
||||
${item.field}: [{ type: "boolean", required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% }else{ %>
|
||||
${item.field}: [{ required: true, message: "不能为空", trigger: "blur" }],
|
||||
<% } %>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
},
|
||||
submitLoading: false,
|
||||
data: [],
|
||||
dataEdit: []
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
// 初始化一级节点
|
||||
this.getParentList();
|
||||
// 初始化一级节点为编辑上级节点使用
|
||||
this.getParentListEdit();
|
||||
},
|
||||
getParentList() {
|
||||
// this.loading = true;
|
||||
// this.getRequest("一级数据请求路径,如/tree/getByParentId/0").then(res => {
|
||||
// this.loading = false;
|
||||
// if (res.success) {
|
||||
// res.result.forEach(function(e) {
|
||||
// if (e.isParent) {
|
||||
// e.loading = false;
|
||||
// e.children = [];
|
||||
// }
|
||||
// });
|
||||
// this.data = res.result;
|
||||
// }
|
||||
// });
|
||||
// 模拟请求成功
|
||||
this.data = [
|
||||
];
|
||||
},
|
||||
getParentListEdit() {
|
||||
// this.loadingEdit = true;
|
||||
// this.getRequest("/tree/getByParentId/0").then(res => {
|
||||
// this.loadingEdit = false;
|
||||
// if (res.success) {
|
||||
// res.result.forEach(function(e) {
|
||||
// if (e.isParent) {
|
||||
// e.loading = false;
|
||||
// e.children = [];
|
||||
// }
|
||||
// });
|
||||
// // 头部加入一级
|
||||
// let first = {
|
||||
// id: "0",
|
||||
// title: "一级节点"
|
||||
// };
|
||||
// res.result.unshift(first);
|
||||
// this.dataEdit = res.result;
|
||||
// }
|
||||
// });
|
||||
// 模拟请求成功
|
||||
this.dataEdit = [
|
||||
];
|
||||
},
|
||||
loadData(item, callback) {
|
||||
// 异步加载树子节点数据
|
||||
// this.getRequest("请求路径,如/tree/getByParentId/" + item.id).then(res => {
|
||||
// if (res.success) {
|
||||
// res.result.forEach(function(e) {
|
||||
// if (e.isParent) {
|
||||
// e.loading = false;
|
||||
// e.children = [];
|
||||
// }
|
||||
// });
|
||||
// callback(res.result);
|
||||
// }
|
||||
// });
|
||||
},
|
||||
search() {
|
||||
// 搜索树
|
||||
if (this.searchKey) {
|
||||
// 模拟请求
|
||||
// this.loading = true;
|
||||
// this.getRequest("搜索请求路径", { title: this.searchKey }).then(res => {
|
||||
// this.loading = false;
|
||||
// if (res.success) {
|
||||
// this.data = res.result;
|
||||
// }
|
||||
// });
|
||||
// 模拟请求成功
|
||||
this.data = [
|
||||
];
|
||||
} else {
|
||||
// 为空重新加载
|
||||
this.getParentList();
|
||||
}
|
||||
},
|
||||
selectTree(v) {
|
||||
if (v.length > 0) {
|
||||
// 转换null为""
|
||||
for (let attr in v[0]) {
|
||||
if (v[0][attr] === null) {
|
||||
v[0][attr] = "";
|
||||
}
|
||||
}
|
||||
let str = JSON.stringify(v[0]);
|
||||
let data = JSON.parse(str);
|
||||
this.form = data;
|
||||
this.editTitle = data.title;
|
||||
} else {
|
||||
this.cancelEdit();
|
||||
}
|
||||
},
|
||||
cancelEdit() {
|
||||
let data = this.$refs.tree.getSelectedNodes()[0];
|
||||
if (data) {
|
||||
data.selected = false;
|
||||
}
|
||||
this.$refs.form.resetFields();
|
||||
this.form.id = "";
|
||||
this.editTitle = "";
|
||||
},
|
||||
selectTreeEdit(v) {
|
||||
if (v.length > 0) {
|
||||
// 转换null为""
|
||||
for (let attr in v[0]) {
|
||||
if (v[0][attr] === null) {
|
||||
v[0][attr] = "";
|
||||
}
|
||||
}
|
||||
let str = JSON.stringify(v[0]);
|
||||
let data = JSON.parse(str);
|
||||
this.form.parentId = data.id;
|
||||
this.form.parentTitle = data.title;
|
||||
}
|
||||
},
|
||||
handleReset() {
|
||||
this.$refs.form.resetFields();
|
||||
this.form.status = 0;
|
||||
},
|
||||
submitEdit() {
|
||||
this.$refs.form.validate(valid => {
|
||||
if (valid) {
|
||||
if (!this.form.id) {
|
||||
this.$Message.warning("请先点击选择要修改的节点");
|
||||
return;
|
||||
}
|
||||
this.submitLoading = true;
|
||||
// 避免传入null字符串
|
||||
// this.postRequest("请求路径,如/tree/edit", this.form).then(res => {
|
||||
// this.submitLoading = false;
|
||||
// if (res.success) {
|
||||
// this.$Message.success("编辑成功");
|
||||
// this.init();
|
||||
// this.modalVisible = false;
|
||||
// }
|
||||
// });
|
||||
// 模拟成功
|
||||
this.submitLoading = false;
|
||||
this.$Message.success("编辑成功");
|
||||
this.modalVisible = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
submitAdd() {
|
||||
this.$refs.formAdd.validate(valid => {
|
||||
if (valid) {
|
||||
this.submitLoading = true;
|
||||
// this.postRequest("请求路径,如/tree/add", this.formAdd).then(res => {
|
||||
// this.submitLoading = false;
|
||||
// if (res.success) {
|
||||
// this.$Message.success("添加成功");
|
||||
// this.init();
|
||||
// this.modalVisible = false;
|
||||
// }
|
||||
// });
|
||||
// 模拟成功
|
||||
this.submitLoading = false;
|
||||
this.$Message.success("添加成功");
|
||||
this.modalVisible = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
add() {
|
||||
if (this.form.id == "" || this.form.id == null) {
|
||||
this.$Message.warning("请先点击选择一个节点");
|
||||
return;
|
||||
}
|
||||
this.modalTitle = "添加子节点";
|
||||
this.showParent = true;
|
||||
this.formAdd = {
|
||||
parentId: this.form.id,
|
||||
sortOrder: 0,
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.editable){
|
||||
%>
|
||||
<% if(item.type=="switch"){ %>
|
||||
${item.field}: true,
|
||||
<% }else if(item.type=="number"||item.type=="slider"){ %>
|
||||
${item.field}: 0,
|
||||
<% }else if(item.type=="area"){ %>
|
||||
${item.field}: [],
|
||||
<% }else{ %>
|
||||
${item.field}: "",
|
||||
<% } %>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
};
|
||||
this.modalVisible = true;
|
||||
},
|
||||
addRoot() {
|
||||
this.modalTitle = "添加一级节点";
|
||||
this.showParent = false;
|
||||
this.formAdd = {
|
||||
parentId: 0,
|
||||
sortOrder: 0,
|
||||
title: "",
|
||||
<%
|
||||
for(item in fields){
|
||||
if(item.editable){
|
||||
%>
|
||||
<% if(item.type=="switch"){ %>
|
||||
${item.field}: true,
|
||||
<% }else if(item.type=="number"||item.type=="slider"){ %>
|
||||
${item.field}: 0,
|
||||
<% }else if(item.type=="area"){ %>
|
||||
${item.field}: [],
|
||||
<% }else{ %>
|
||||
${item.field}: "",
|
||||
<% } %>
|
||||
<%
|
||||
}
|
||||
}
|
||||
%>
|
||||
};
|
||||
this.modalVisible = true;
|
||||
},
|
||||
changeSelect(v) {
|
||||
this.selectCount = v.length;
|
||||
this.selectList = v;
|
||||
},
|
||||
delAll() {
|
||||
if (this.selectCount <= 0) {
|
||||
this.$Message.warning("您还未勾选要删除的数据");
|
||||
return;
|
||||
}
|
||||
this.$Modal.confirm({
|
||||
title: "确认删除",
|
||||
content: "您确认要删除所选的 " + this.selectCount + " 条数据及其下级所有数据?",
|
||||
loading: true,
|
||||
onOk: () => {
|
||||
let ids = "";
|
||||
this.selectList.forEach(function(e) {
|
||||
ids += e.id + ",";
|
||||
});
|
||||
ids = ids.substring(0, ids.length - 1);
|
||||
// this.deleteRequest("请求路径,如/tree/delByIds/" + ids).then(res => {
|
||||
// this.$Modal.remove();
|
||||
// if (res.success) {
|
||||
// this.$Message.success("删除成功");
|
||||
// this.selectList = [];
|
||||
// this.selectCount = 0;
|
||||
// this.cancelEdit();
|
||||
// this.init();
|
||||
// }
|
||||
// });
|
||||
// 模拟成功
|
||||
this.$Modal.remove();
|
||||
this.$Message.success("删除成功");
|
||||
this.selectList = [];
|
||||
this.selectCount = 0;
|
||||
this.cancelEdit();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// 计算高度
|
||||
let height = document.documentElement.clientHeight;
|
||||
this.maxHeight = Number(height-287) + "px";
|
||||
this.init();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style lang="less">
|
||||
// 建议引入通用样式 可删除下面样式代码
|
||||
// @import "../../../styles/tree-common.less";
|
||||
.search {
|
||||
.operation {
|
||||
margin-bottom: 2vh;
|
||||
}
|
||||
.select-title {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: #40a9ff;
|
||||
}
|
||||
.select-clear {
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.tree-bar {
|
||||
overflow: auto;
|
||||
margin-top: 5px;
|
||||
position: relative;
|
||||
min-height: 80px;
|
||||
}
|
||||
|
||||
.tree-bar::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
.tree-bar::-webkit-scrollbar-thumb {
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: inset 0 0 2px #d1d1d1;
|
||||
background: #e4e4e4;
|
||||
}
|
||||
</style>
|
@ -97,13 +97,8 @@ public class BrandManagerController {
|
||||
@ApiImplicitParam(name = "ids", value = "品牌ID", required = true, dataType = "String", allowMultiple = true, paramType = "path")
|
||||
@DeleteMapping(value = "/delByIds/{ids}")
|
||||
public ResultMessage<Object> delAllByIds(@PathVariable List<String> ids) {
|
||||
|
||||
for (String id : ids) {
|
||||
Brand brand = brandService.getById(id);
|
||||
brand.setDeleteFlag(true);
|
||||
brandService.updateById(brand);
|
||||
}
|
||||
return ResultUtil.success(ResultCode.BRAND_DELETE_ERROR);
|
||||
brandService.removeByIds(ids);
|
||||
return ResultUtil.success(ResultCode.SUCCESS);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ public class MemberEvaluationManagerController {
|
||||
@GetMapping(value = "/getByPage")
|
||||
public ResultMessage<IPage<MemberEvaluationListVO>> getByPage(EvaluationQueryParams evaluationQueryParams, PageVO page) {
|
||||
|
||||
return ResultUtil.data(memberEvaluationService.queryPage(evaluationQueryParams, page));
|
||||
return ResultUtil.data(memberEvaluationService.queryPage(evaluationQueryParams));
|
||||
}
|
||||
|
||||
@ApiOperation(value = "修改评价状态")
|
||||
|
@ -1,9 +1,15 @@
|
||||
package cn.lili.controller.other;
|
||||
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.lili.modules.goods.entity.dos.Goods;
|
||||
import cn.lili.modules.goods.entity.dos.GoodsParams;
|
||||
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
||||
import cn.lili.modules.goods.entity.dos.Parameters;
|
||||
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
|
||||
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
|
||||
import cn.lili.modules.goods.service.GoodsService;
|
||||
import cn.lili.modules.goods.service.GoodsSkuService;
|
||||
import cn.lili.modules.goods.service.ParametersService;
|
||||
import cn.lili.modules.promotion.service.PromotionService;
|
||||
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
||||
import cn.lili.modules.search.service.EsGoodsIndexService;
|
||||
@ -38,12 +44,18 @@ public class ElasticsearchController {
|
||||
@Autowired
|
||||
private GoodsSkuService goodsSkuService;
|
||||
|
||||
@Autowired
|
||||
private GoodsService goodsService;
|
||||
|
||||
@Autowired
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
|
||||
@Autowired
|
||||
private PromotionService promotionService;
|
||||
|
||||
@Autowired
|
||||
private ParametersService parametersService;
|
||||
|
||||
@GetMapping
|
||||
public void init() {
|
||||
//查询商品信息
|
||||
@ -53,16 +65,33 @@ public class ElasticsearchController {
|
||||
|
||||
List<GoodsSku> list = goodsSkuService.list(queryWrapper);
|
||||
List<EsGoodsIndex> esGoodsIndices = new ArrayList<>();
|
||||
String goodsId = null;
|
||||
//库存锁是在redis做的,所以生成索引,同时更新一下redis中的库存数量
|
||||
for (GoodsSku goodsSku : list) {
|
||||
EsGoodsIndex index = new EsGoodsIndex(goodsSku);
|
||||
Map<String, Object> goodsCurrentPromotionMap = promotionService.getGoodsCurrentPromotionMap(index);
|
||||
index.setPromotionMap(goodsCurrentPromotionMap);
|
||||
esGoodsIndices.add(index);
|
||||
stringRedisTemplate.opsForValue().set(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity().toString());
|
||||
boolean needIndex = false;
|
||||
if (goodsId == null || !goodsId.equals(goodsSku.getGoodsId())) {
|
||||
goodsId = goodsSku.getGoodsId();
|
||||
Goods goods = goodsService.getById(goodsId);
|
||||
if (goods.getParams() != null && !goods.getParams().isEmpty()) {
|
||||
List<GoodsParams> goodsParams = JSONUtil.toList(goods.getParams(), GoodsParams.class);
|
||||
for (GoodsParams goodsParam : goodsParams) {
|
||||
Parameters parameters = parametersService.getById(goodsParam.getParamId());
|
||||
if (parameters.getIsIndex() == 1) {
|
||||
needIndex = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Boolean.TRUE.equals(needIndex)) {
|
||||
EsGoodsIndex index = new EsGoodsIndex(goodsSku);
|
||||
Map<String, Object> goodsCurrentPromotionMap = promotionService.getGoodsCurrentPromotionMap(index);
|
||||
index.setPromotionMap(goodsCurrentPromotionMap);
|
||||
esGoodsIndices.add(index);
|
||||
stringRedisTemplate.opsForValue().set(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity().toString());
|
||||
}
|
||||
}
|
||||
//初始化商品索引
|
||||
esGoodsIndexService.initIndex(esGoodsIndices);
|
||||
Assertions.assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package cn.lili.controller.setting;
|
||||
|
||||
import cn.lili.common.enums.ResultUtil;
|
||||
import cn.lili.common.vo.ResultMessage;
|
||||
import cn.lili.modules.base.aspect.DemoSite;
|
||||
import cn.lili.modules.base.service.RegionService;
|
||||
import cn.lili.modules.system.entity.dos.Region;
|
||||
import io.swagger.annotations.Api;
|
||||
@ -29,6 +30,7 @@ public class RegionManagerController {
|
||||
@Autowired
|
||||
private RegionService regionService;
|
||||
|
||||
@DemoSite
|
||||
@PostMapping(value = "/sync")
|
||||
@ApiOperation(value = "同步高德行政地区数据")
|
||||
public void synchronizationData(String url) {
|
||||
|
@ -2,7 +2,7 @@ package cn.lili.controller.trade;
|
||||
|
||||
import cn.lili.common.enums.ResultUtil;
|
||||
import cn.lili.common.vo.ResultMessage;
|
||||
import cn.lili.modules.member.entity.dto.StoreEvaluationQueryParams;
|
||||
import cn.lili.modules.member.entity.dto.EvaluationQueryParams;
|
||||
import cn.lili.modules.member.entity.vo.MemberEvaluationListVO;
|
||||
import cn.lili.modules.member.entity.vo.MemberEvaluationVO;
|
||||
import cn.lili.modules.member.service.MemberEvaluationService;
|
||||
@ -30,9 +30,8 @@ public class MemberEvaluationStoreController {
|
||||
|
||||
@ApiOperation(value = "分页获取会员评论列表")
|
||||
@GetMapping
|
||||
public ResultMessage<IPage<MemberEvaluationListVO>> getByPage(StoreEvaluationQueryParams storeEvaluationQueryParams) {
|
||||
|
||||
return ResultUtil.data(memberEvaluationService.queryByParams(storeEvaluationQueryParams));
|
||||
public ResultMessage<IPage<MemberEvaluationListVO>> getByPage(EvaluationQueryParams evaluationQueryParams) {
|
||||
return ResultUtil.data(memberEvaluationService.queryPage(evaluationQueryParams));
|
||||
}
|
||||
|
||||
@ApiOperation(value = "通过id获取")
|
||||
|
Loading…
x
Reference in New Issue
Block a user