xiaoyong931011
2021-09-28 041f8683651a19ebe041c239a3ca19822c53470c
20210928
5 files added
20 files modified
1222 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/MailGoodsSkuDto.java 34 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java 40 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsImagesMapper.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallShoppingCartMapper.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java 180 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMailGoodsImagesVo.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMailGoodsSkuDetailVo.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMailGoodsUpdateVo.java 39 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallGoodsImagesMapper.xml 8 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallGoodsMapper.xml 14 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallGoodsSkuMapper.xml 4 ●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallShoppingCartMapper.xml 11 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsList.html 4 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsUpdate.html 277 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html 521 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html 1 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/order/orderList.html 20 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java
@@ -7,6 +7,7 @@
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.utils.OssUtils;
import cc.mrbird.febs.mall.dto.AddMallGoodsDto;
import cc.mrbird.febs.mall.dto.MallGoodsUpdateDto;
import cc.mrbird.febs.mall.dto.UpMallGoodsDto;
import cc.mrbird.febs.mall.entity.MallGoods;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
@@ -120,4 +121,14 @@
    }
    /**
     * 商品-编辑
     */
    @PostMapping("updateMallGoods")
    @ControllerEndpoint(operation = "商品-编辑", exceptionMessage = "操作失败")
    public FebsResponse updateMallGoods(@RequestBody @Valid MallGoodsUpdateDto mallGoodsUpdateDto) {
        return adminMallGoodsService.updateMallGoods(mallGoodsUpdateDto);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java
@@ -6,6 +6,7 @@
import cc.mrbird.febs.mall.service.IAdminMallGoodsService;
import cc.mrbird.febs.mall.service.IAdminMallMemberService;
import cc.mrbird.febs.mall.vo.AdminMailGoodsDetailVo;
import cc.mrbird.febs.mall.vo.AdminMailGoodsUpdateVo;
import cc.mrbird.febs.mall.vo.MallMemberVo;
import lombok.RequiredArgsConstructor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -72,11 +73,11 @@
     * @param model
     * @return
     */
    @GetMapping("goodsUpdate/{id}")
    @RequiresPermissions("goodsUpdate:update")
    @GetMapping("goodsUpdateNew/{id}")
    @RequiresPermissions("goodsUpdateNew:update")
    public String goodsUpdate(@PathVariable long id, Model model) {
        AdminMailGoodsDetailVo data = mallGoodsService.getMallGoodsInfoById(id);
        AdminMailGoodsUpdateVo data = mallGoodsService.getMallGoodsUpdateInfoById(id);
        model.addAttribute("mailGoodsUpdate", data);
        return FebsUtil.view("modules/goods/goodsUpdate");
        return FebsUtil.view("modules/goods/goodsUpdateNew");
    }
}
src/main/java/cc/mrbird/febs/mall/dto/MailGoodsSkuDto.java
New file
@@ -0,0 +1,34 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "MailGoodsSkuDto", description = "参数接收类")
public class MailGoodsSkuDto {
    private Long id;
    private String styleName;
    private String skuName;
    private String skuImage;
    private Integer stock;
    private Integer skuVolume;
    private BigDecimal originalPrice;
    private BigDecimal presentPrice;
    private Long styleId;
    private Long goodsId;
    private String delLog;
}
src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java
New file
@@ -0,0 +1,40 @@
package cc.mrbird.febs.mall.dto;
import cc.mrbird.febs.mall.vo.AdminMailGoodsSkuDetailVo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "MallGoodsUpdateDto", description = "参数接收类")
public class MallGoodsUpdateDto {
    private Long id;
    private String goodsNo;
    private String goodsName;
    private List<MailGoodsSkuDto> mailGoodsSkuDto;
    private String thumbs;
    private String goodsIntrodution;
    private String unit;
    private String thumb;
    private String goodsDetails;
    private Integer isSale;
    private String originalPrice;
    private String presentPrice;
    private Long categoryId;
    private Integer isHot;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsImagesMapper.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallGoodsImages;
import cc.mrbird.febs.mall.vo.AdminMailGoodsImagesVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
@@ -13,4 +14,8 @@
public interface MallGoodsImagesMapper extends BaseMapper<MallGoodsImages> {
    List<String> selectGoodsImagesByGoodsId(@Param("goodsId") Long goodsId);
    List<String> selectByGoodId(@Param("goodsId") long id);
    void deleteByGoodsId(@Param("goodsId")Long id);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java
@@ -3,6 +3,7 @@
import cc.mrbird.febs.mall.dto.MallGoodsQueryDto;
import cc.mrbird.febs.mall.entity.MallGoods;
import cc.mrbird.febs.mall.vo.AdminMailGoodsDetailVo;
import cc.mrbird.febs.mall.vo.AdminMailGoodsUpdateVo;
import cc.mrbird.febs.mall.vo.AdminMallGoodsVo;
import cc.mrbird.febs.mall.vo.MallGoodsListVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -24,11 +25,17 @@
    Integer selectMallGoodsCountByGoodsName(@Param("goodsName")String goodsName);
    Integer selectMallGoodsCountByGoodsNameAndGoodId(@Param("goodsName")String goodsName,@Param("id")Long id);
    Integer selectMallGoodsCountByGoodsNo(@Param("goodsNo")String goodsNo);
    Integer selectMallGoodsCountByGoodsNoAndGoodId(@Param("goodsNo")String goodsNo,@Param("id")Long id);
    AdminMailGoodsDetailVo selectMallGoodsInfoById(@Param("id")long id);
    Map<String, BigDecimal> selectGoodsStockAndVolume(@Param("id") Long id);
    List<MallGoods> selectMallGoodsByCategaryId(@Param("categaryId")Long id);
    AdminMailGoodsUpdateVo getMallGoodsUpdateInfoById(@Param("id")long id);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallShoppingCartMapper.java
@@ -17,4 +17,8 @@
    MallShoppingCart selectCartGoodsBySkuId(@Param("skuId") Long skuId, @Param("memberId") Long memberId);
    int delBySkuId(@Param("skuId") Long skuId, @Param("memberId") Long memberId);
    void deleteByGoodsId(@Param("goodsId")Long id);
    void deleteByGoodsIdAndSkuId(@Param("skuId")Long id, @Param("goodsId")Long goodsId);
}
src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java
@@ -3,9 +3,12 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.dto.AddMallGoodsDto;
import cc.mrbird.febs.mall.dto.MallGoodsUpdateDto;
import cc.mrbird.febs.mall.dto.UpMallGoodsDto;
import cc.mrbird.febs.mall.entity.MallGoods;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.vo.AdminMailGoodsDetailVo;
import cc.mrbird.febs.mall.vo.AdminMailGoodsUpdateVo;
import cc.mrbird.febs.mall.vo.AdminMallGoodsVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -23,4 +26,8 @@
    FebsResponse delMallGoods(Long id);
    AdminMailGoodsDetailVo getMallGoodsInfoById(long id);
    AdminMailGoodsUpdateVo getMallGoodsUpdateInfoById(long id);
    FebsResponse updateMallGoods(MallGoodsUpdateDto mallGoodsUpdateDto);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java
@@ -18,12 +18,14 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class AdminMallGoodsCategoryService extends ServiceImpl<MallGoodsCategoryMapper, MallGoodsCategory> implements IAdminMallGoodsCategoryService {
    private final MallGoodsCategoryMapper mallGoodsCategoryMapper;
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java
@@ -2,15 +2,11 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.dto.AddMallGoodsDto;
import cc.mrbird.febs.mall.dto.AddMallGoodsSkuDto;
import cc.mrbird.febs.mall.dto.UpMallGoodsDto;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.IAdminMallGoodsService;
import cc.mrbird.febs.mall.vo.AdminMailGoodsDetailVo;
import cc.mrbird.febs.mall.vo.AdminMailGoodsSkuDetailVo;
import cc.mrbird.febs.mall.vo.AdminMallGoodsVo;
import cc.mrbird.febs.mall.vo.*;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
@@ -23,6 +19,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -30,6 +27,7 @@
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class AdminMallGoodsService extends ServiceImpl<MallGoodsMapper, MallGoods> implements IAdminMallGoodsService {
    private final MallGoodsCategoryMapper mallGoodsCategoryMapper;
@@ -37,6 +35,7 @@
    private final MallGoodsSkuMapper mallGoodsSkuMapper;
    private final MallGoodsStyleMapper mallGoodsStyleMapper;
    private final MallGoodsImagesMapper mallGoodsImagesMapper;
    private final MallShoppingCartMapper mallShoppingCartMapper;
    @Override
    public IPage<AdminMallGoodsVo> getCategoryListInPage(MallGoods mallGoods, QueryRequest request) {
@@ -76,6 +75,10 @@
            String skuName = addSku.getSkuName();
            if(StrUtil.isEmpty(skuName)){
                return new FebsResponse().fail().message("商品规格名称不能为空");
            }
            String skuImage = addSku.getSkuImage();
            if(StrUtil.isEmpty(skuImage)){
                return new FebsResponse().fail().message("商品规格图片不能为空");
            }
            Integer skuVolume = addSku.getSkuVolume()==null?0: addSku.getSkuVolume();
            if(skuVolume < 0){
@@ -189,6 +192,7 @@
    }
    @Override
    @Transactional
    public FebsResponse delMallGoods(Long id) {
        MallGoods mallGoods = mallGoodsMapper.selectById(id);
        if(ObjectUtil.isEmpty(mallGoods)){
@@ -202,6 +206,8 @@
        mallGoodsStyleMapper.deleteByGoodsId(id);
        mallGoodsSkuMapper.deleteByGoodsId(id);
        mallGoodsMapper.deleteById(mallGoods);
        mallShoppingCartMapper.deleteByGoodsId(id);
        return new FebsResponse().success();
    }
@@ -213,5 +219,167 @@
        return adminMailGoodsDetailVo;
    }
    @Override
    public AdminMailGoodsUpdateVo getMallGoodsUpdateInfoById(long id) {
        AdminMailGoodsUpdateVo adminMailGoodsUpdateVo = mallGoodsMapper.getMallGoodsUpdateInfoById(id);
        List<AdminMailGoodsSkuDetailVo> adminMailGoodsSkuDetailVos = mallGoodsSkuMapper.selectByGoodId(id);
        if(CollUtil.isNotEmpty(adminMailGoodsSkuDetailVos)){
            adminMailGoodsUpdateVo.setMailGoodsSkuDetailVo(adminMailGoodsSkuDetailVos);
        }
        List<String> adminMailGoodsImagesVos = mallGoodsImagesMapper.selectByGoodId(id);
        if(CollUtil.isNotEmpty(adminMailGoodsImagesVos)){
            adminMailGoodsUpdateVo.setMailGoodsImagesVo(adminMailGoodsImagesVos);
        }
        return adminMailGoodsUpdateVo;
    }
    @Override
    @Transactional
    public FebsResponse updateMallGoods(MallGoodsUpdateDto mallGoodsUpdateDto) {
        String goodsName = mallGoodsUpdateDto.getGoodsName();
        if(StrUtil.isEmpty(goodsName)){
            return new FebsResponse().fail().message("商品名称不能为空");
        }
        Integer mallGoodsByGoodsName = mallGoodsMapper.selectMallGoodsCountByGoodsNameAndGoodId(goodsName,mallGoodsUpdateDto.getId());
        if(mallGoodsByGoodsName > 0){
            return new FebsResponse().fail().message("商品名称不能重复");
        }
        String goodsNo = mallGoodsUpdateDto.getGoodsNo();
        if(StrUtil.isEmpty(goodsNo)){
            return new FebsResponse().fail().message("商品编号不能为空");
        }
        Integer mallGoodsByGoodsNo = mallGoodsMapper.selectMallGoodsCountByGoodsNoAndGoodId(goodsNo,mallGoodsUpdateDto.getId());
        if(mallGoodsByGoodsNo > 0){
            return new FebsResponse().fail().message("商品编号不能重复");
        }
        Long categoryId = mallGoodsUpdateDto.getCategoryId();
        if(ObjectUtil.isEmpty(categoryId)){
            return new FebsResponse().fail().message("商品分类不能为空");
        }
        List<MailGoodsSkuDto> addSkus = mallGoodsUpdateDto.getMailGoodsSkuDto();
        if(CollUtil.isEmpty(addSkus)){
            return new FebsResponse().fail().message("商品规格不能为空");
        }
        for(MailGoodsSkuDto addSku : addSkus){
            String skuName = addSku.getSkuName();
            if(StrUtil.isEmpty(skuName)){
                return new FebsResponse().fail().message("商品规格名称不能为空");
            }
            String skuImage = addSku.getSkuImage();
            if(StrUtil.isEmpty(skuImage)){
                return new FebsResponse().fail().message("商品规格图片不能为空");
            }
            Integer skuVolume = addSku.getSkuVolume()==null?0: addSku.getSkuVolume();
            if(skuVolume < 0){
                return new FebsResponse().fail().message("商品规格销售数量不能小于0");
            }
            Integer stock = addSku.getStock()==null?0: addSku.getStock();
            if(stock < 0){
                return new FebsResponse().fail().message("商品规格库存必须大于0");
            }
            BigDecimal originalPrice = addSku.getOriginalPrice();
            if(originalPrice.compareTo(BigDecimal.ZERO) <= 0){
                return new FebsResponse().fail().message("商品规格原价不能小于0");
            }
            BigDecimal presentPrice = addSku.getPresentPrice();
            if(presentPrice.compareTo(BigDecimal.ZERO) <= 0){
                return new FebsResponse().fail().message("商品规格现价不能小于0");
            }
        }
        //新增商品
        MallGoods mallGoods = mallGoodsMapper.selectById(mallGoodsUpdateDto.getId());
        mallGoods.setGoodsNo(mallGoodsUpdateDto.getGoodsNo());
        mallGoods.setGoodsName(mallGoodsUpdateDto.getGoodsName());
        mallGoods.setGoodsIntrodution(mallGoodsUpdateDto.getGoodsIntrodution());
        mallGoods.setUnit(mallGoodsUpdateDto.getUnit());
        mallGoods.setThumb(mallGoodsUpdateDto.getThumb());
        mallGoods.setGoodsDetails(mallGoodsUpdateDto.getGoodsDetails());
        mallGoods.setOriginalPrice(mallGoodsUpdateDto.getOriginalPrice());
        mallGoods.setCategoryId(mallGoodsUpdateDto.getCategoryId());
        mallGoods.setPresentPrice(mallGoodsUpdateDto.getPresentPrice());
        mallGoods.setIsHot(mallGoodsUpdateDto.getIsHot());
//        mallGoods.setIsSale(MallGoods.ISSALE_STATUS_DISABLED);
        mallGoodsMapper.updateById(mallGoods);
        mallGoodsImagesMapper.deleteByGoodsId(mallGoodsUpdateDto.getId());
        String thumbs = mallGoodsUpdateDto.getThumbs();
        if(StrUtil.isNotEmpty(thumbs)){
            List<String> imgs = StrUtil.splitTrim(thumbs, ",");
            if(CollUtil.isNotEmpty(imgs)){
                int i = 1;
                for(String img : imgs){
                    MallGoodsImages mallGoodsImages = new MallGoodsImages();
                    mallGoodsImages.setGoodsId(mallGoods.getId());
                    mallGoodsImages.setImageUrl(img);
                    mallGoodsImages.setSeq(i);
                    mallGoodsImagesMapper.insert(mallGoodsImages);
                    i++;
                }
            }
        }
        List<MailGoodsSkuDto> mailGoodsSkuDto = mallGoodsUpdateDto.getMailGoodsSkuDto();
        Set<String> styles = new HashSet<>();
        if(CollUtil.isNotEmpty(mailGoodsSkuDto)){
            for(MailGoodsSkuDto addStyleDto : mailGoodsSkuDto){
                if(ObjectUtil.isNotEmpty(addStyleDto.getDelLog())){
                    mallGoodsSkuMapper.deleteById(addStyleDto.getId());
                    mallShoppingCartMapper.deleteByGoodsIdAndSkuId(addStyleDto.getId(),addStyleDto.getGoodsId());
                }
                if(ObjectUtil.isEmpty(addStyleDto.getStyleId())){
                    MallGoodsStyle mallGoodsStyleSku = mallGoodsStyleMapper.selectByStyleName(addStyleDto.getStyleName(),mallGoods.getId());
                    if(ObjectUtil.isEmpty(mallGoodsStyleSku)){
                        styles.add(addStyleDto.getStyleName());
                    }
                }
            }
        }
        if(CollUtil.isNotEmpty(styles)){
            for(String style : styles){
                //新增样式
                MallGoodsStyle mallGoodsStyle = new MallGoodsStyle();
                mallGoodsStyle.setName(style);
                mallGoodsStyle.setGoodsId(mallGoods.getId());
                mallGoodsStyleMapper.insert(mallGoodsStyle);
            }
        }
        if(CollUtil.isNotEmpty(mailGoodsSkuDto)){
            for(MailGoodsSkuDto addMallGoodsSkuDto : mailGoodsSkuDto){
                if(StrUtil.isEmpty(addMallGoodsSkuDto.getDelLog())){
                    if(ObjectUtil.isNotEmpty(addMallGoodsSkuDto.getId())){
                        MallGoodsSku mallGoodsSku = mallGoodsSkuMapper.selectById(addMallGoodsSkuDto.getId());
                        mallGoodsSku.setSkuName(addMallGoodsSkuDto.getSkuName());
                        mallGoodsSku.setSkuImage(addMallGoodsSkuDto.getSkuImage());
                        mallGoodsSku.setStock(addMallGoodsSkuDto.getStock()==null?0:addMallGoodsSkuDto.getStock());
                        mallGoodsSku.setSkuVolume(addMallGoodsSkuDto.getSkuVolume()==null?0:addMallGoodsSkuDto.getSkuVolume());
                        mallGoodsSku.setOriginalPrice(addMallGoodsSkuDto.getOriginalPrice());
                        mallGoodsSku.setPresentPrice(addMallGoodsSkuDto.getPresentPrice());
                        mallGoodsSku.setStyleId(addMallGoodsSkuDto.getStyleId());
                        mallGoodsSku.setGoodsId(mallGoods.getId());
                        mallGoodsSkuMapper.updateById(mallGoodsSku);
                    }else{
                        //新增商品规格
                        MallGoodsStyle mallGoodsStyleSku = mallGoodsStyleMapper.selectByStyleName(addMallGoodsSkuDto.getStyleName(),mallGoods.getId());
                        MallGoodsSku mallGoodsSku = new MallGoodsSku();
                        mallGoodsSku.setSkuName(addMallGoodsSkuDto.getSkuName());
                        mallGoodsSku.setSkuImage(addMallGoodsSkuDto.getSkuImage());
                        mallGoodsSku.setStock(addMallGoodsSkuDto.getStock()==null?0:addMallGoodsSkuDto.getStock());
                        mallGoodsSku.setSkuVolume(addMallGoodsSkuDto.getSkuVolume()==null?0:addMallGoodsSkuDto.getSkuVolume());
                        mallGoodsSku.setOriginalPrice(addMallGoodsSkuDto.getOriginalPrice());
                        mallGoodsSku.setPresentPrice(addMallGoodsSkuDto.getPresentPrice());
                        mallGoodsSku.setStyleId(mallGoodsStyleSku.getId());
                        mallGoodsSku.setGoodsId(mallGoods.getId());
                        mallGoodsSkuMapper.insert(mallGoodsSku);
                    }
                }
            }
        }
        return new FebsResponse().success().message("操作成功");
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
@@ -33,6 +33,7 @@
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class AdminMallMemberServiceImpl extends ServiceImpl<MallMemberMapper, MallMember> implements IAdminMallMemberService {
    private final MallMemberMapper mallMemberMapper;
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java
@@ -17,12 +17,14 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class AdminMallOrderService extends ServiceImpl<MallOrderInfoMapper, MallOrderInfo> implements IAdminMallOrderService {
    private final MallOrderInfoMapper mallOrderInfoMapper;
src/main/java/cc/mrbird/febs/mall/vo/AdminMailGoodsImagesVo.java
New file
@@ -0,0 +1,15 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel(value = "AdminMailGoodsImagesVo", description = "信息返回类")
public class AdminMailGoodsImagesVo {
    private String imageUrl;
    private Integer seq;
    private Long goodsId;
}
src/main/java/cc/mrbird/febs/mall/vo/AdminMailGoodsSkuDetailVo.java
@@ -19,6 +19,10 @@
    @ApiModelProperty(value = "sku图片")
    private String skuImage;
    private String styleName;
    private Long  styleId;
    @ApiModelProperty(value = "库存")
    private Integer stock;
src/main/java/cc/mrbird/febs/mall/vo/AdminMailGoodsUpdateVo.java
New file
@@ -0,0 +1,39 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "AdminMailGoodsUpdateVo", description = "信息返回类")
public class AdminMailGoodsUpdateVo {
    private Long id;
    private String goodsNo;
    private String goodsName;
    private List<AdminMailGoodsSkuDetailVo> mailGoodsSkuDetailVo;
    private List<String> mailGoodsImagesVo;
    private String goodsIntrodution;
    private String unit;
    private String thumb;
    private String goodsDetails;
    private Integer isSale;
    private String originalPrice;
    private String presentPrice;
    private Long categoryId;
    private Integer isHot;
}
src/main/resources/mapper/modules/MallGoodsImagesMapper.xml
@@ -5,4 +5,12 @@
    <select id="selectGoodsImagesByGoodsId" resultType="java.lang.String">
        select image_url from mall_goods_images where goods_id=#{goodsId}
    </select>
    <select id="selectByGoodId" resultType="java.lang.String">
        select image_url from mall_goods_images where goods_id = #{goodsId}
    </select>
    <delete  id="deleteByGoodsId">
        delete from mall_goods_images where goods_id = #{goodsId}
    </delete>
</mapper>
src/main/resources/mapper/modules/MallGoodsMapper.xml
@@ -138,8 +138,18 @@
        select count(id) from mall_goods a where a.goods_name = #{goodsName}
    </select>
    <select id="selectMallGoodsCountByGoodsNameAndGoodId" resultType="java.lang.Integer">
        select count(id) from mall_goods a where a.goods_name = #{goodsName} and a.id != #{id}
    </select>
    <select id="selectMallGoodsCountByGoodsNo" resultType="java.lang.Integer">
        select count(id) from mall_goods a where a.goods_no = #{goodsNo}
    </select>
    <select id="selectMallGoodsCountByGoodsNoAndGoodId" resultType="java.lang.Integer">
        select count(id) from mall_goods a where a.goods_no = #{goodsNo} and a.id != #{id}
    </select>
    <select id="selectMallGoodsInfoById" resultType="cc.mrbird.febs.mall.vo.AdminMailGoodsDetailVo">
@@ -157,4 +167,8 @@
    <select id="selectMallGoodsByCategaryId" resultType="cc.mrbird.febs.mall.entity.MallGoods">
        select * from mall_goods a where a.category_id = #{categaryId}
    </select>
    <select id="getMallGoodsUpdateInfoById" resultType="cc.mrbird.febs.mall.vo.AdminMailGoodsUpdateVo">
        select * from mall_goods a where a.id = #{id}
    </select>
</mapper>
src/main/resources/mapper/modules/MallGoodsSkuMapper.xml
@@ -20,7 +20,9 @@
    <select id="selectByGoodId" resultType="cc.mrbird.febs.mall.vo.AdminMailGoodsSkuDetailVo">
        select * from mall_goods_sku where goods_id = #{id}
        select a.*,b.name styleName from mall_goods_sku a
            left join mall_goods_style b on a.style_id=b.ID
        where a.goods_id = #{id}
    </select>
src/main/resources/mapper/modules/MallShoppingCartMapper.xml
@@ -25,4 +25,15 @@
        delete from mall_shopping_cart
        where member_id=#{memberId} and sku_id=#{skuId}
    </delete>
    <delete id="deleteByGoodsId">
        delete from mall_shopping_cart
        where goods_id = #{goodsId}
    </delete>
    <delete id="deleteByGoodsIdAndSkuId">
        delete from mall_shopping_cart
        where goods_id = #{goodsId} and sku_id = #{skuId}
    </delete>
</mapper>
src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html
@@ -190,7 +190,7 @@
            }
        });
        //多图片上传
        //图片上传
        upload.render({
            elem: '#test2'
            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
src/main/resources/templates/febs/views/modules/goods/goodsList.html
@@ -99,10 +99,10 @@
                });
            }
            if (layEvent === 'goodsUpdate') {
                febs.modal.open('编辑', 'modules/goods/goodsUpdate/' + data.id, {
                febs.modal.open('编辑', 'modules/goods/goodsUpdateNew/' + data.id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#goods-update').find('#submit').trigger('click');
                        $('#goods-updatenew').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
src/main/resources/templates/febs/views/modules/goods/goodsUpdate.html
@@ -29,13 +29,13 @@
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">商品名称:</label>
                <div class="layui-input-block">
                    <input type="text" name="goodsName" class="layui-input" readonly>
                    <input type="text" name="goodsName" class="layui-input" >
                </div>
            </div>
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">商品编号:</label>
                <div class="layui-input-block">
                    <input type="text" name="goodsNo" class="layui-input" readonly>
                    <input type="text" name="goodsNo" class="layui-input" >
                </div>
            </div>
        </div>
@@ -43,7 +43,7 @@
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">所属分类:</label>
                <div class="layui-input-block">
                    <select name="parentId" class="categary-goods-update-category" id="categarySelect" readonly>
                    <select name="parentId" class="categary-goods-update-category" id="categarySelect" >
                        <option value="">请选择</option>
                    </select>
                </div>
@@ -75,24 +75,61 @@
                <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" >
            </div>
        </div>
        <!--        <div class="layui-row layui-col-space10 layui-form-item">-->
        <!--            <div class="layui-col-lg6">-->
        <!--                <label class="layui-form-label">规格:</label>-->
        <!--                <div class="layui-input-block">-->
        <!--                    <input type="text" name="addMallGoodsSkuDtos" autocomplete="off" class="layui-input" id="attrName">-->
        <!--                </div>-->
        <!--            </div>-->
        <!--            <div class="layui-col-lg6">-->
        <!--                <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="test3" >添加</button>-->
        <!--            </div>-->
        <!--        </div>-->
                <div class="layui-row layui-col-space10 layui-form-item">
                    <div class="layui-col-lg6">
                        <label class="layui-form-label">规格:</label>
                        <div class="layui-input-block">
                            <input type="text" name="addMallGoodsSkuDtos" autocomplete="off" class="layui-input" id="attrName">
                        </div>
                    </div>
                    <div class="layui-col-lg6">
                        <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="test3" >添加</button>
                    </div>
                </div>
        <div id="attrWrap"></div>
        <div class="layui-form-item">
            <label class="layui-form-label">缩略图链接:</label>
            <label class="layui-form-label febs-form-item-require">缩略图:</label>
            <div class="layui-input-block">
                <img alt="缩略图" data-th-src="${mailGoodsUpdate.thumb}"  style="width: 100px">
                <div class="layui-upload">
                    <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="test2">上传</button>
                    <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
                        <div class="layui-upload-list" id="demo2"></div>
                    </blockquote>
                </div>
            </div>
        </div>
            <div class="layui-form-item">
                <label class="layui-form-label">缩略图链接:</label>
                <div class="layui-input-block">
                    <input type="text" id="thumb" lay-verify="required" name="thumb" autocomplete="off" class="layui-input" readonly>
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label febs-form-item-require">轮播图:</label>
                <div class="layui-input-block">
                    <div class="layui-upload">
                        <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="thumbsBanner">上传</button>
                        <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
                            <div class="layui-upload-list" id="thumbsBanners"></div>
                        </blockquote>
                    </div>
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">缩略图链接:</label>
                <div class="layui-input-block">
                    <input type="text" id="thumbs" lay-verify="required" name="thumbs" autocomplete="off" class="layui-input" readonly>
                </div>
            </div>
<!--        <div class="layui-form-item">-->
<!--            <label class="layui-form-label">缩略图链接:</label>-->
<!--            <div class="layui-input-block">-->
<!--                <img alt="缩略图" data-th-src="${mailGoodsUpdate.thumb}"  style="width: 100px">-->
<!--            </div>-->
<!--        </div>-->
        <div class="layui-form-item">
            <label class="layui-form-label">商品详情:</label>
            <div class="layui-input-block">
@@ -108,23 +145,27 @@
                </div>
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <button class="layui-btn" lay-submit="" lay-filter="goods-update-form-submit" id="submit"></button>
        </div>
    </form>
</div>
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','layedit'], function () {
        var $ = layui.$,
    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate','layedit','upload'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            layer = layui.layer,
            formSelects = layui.formSelects,
            treeSelect = layui.treeSelect,
            form = layui.form,
            laydate = layui.laydate,
            eleTree = layui.eleTree,
            mailGoodsUpdate = [[${mailGoodsUpdate}]],
            $view = $('#goods-update'),
            validate = layui.validate,
            $view = $('#goods-add'),
            layedit = layui.layedit,
            _deptTree;
            upload = layui.upload,
            validate = layui.validate;
        form.render();
@@ -139,6 +180,50 @@
                $("#categarySelect").val(mailGoodsUpdate.categoryId)
                form.render();
            });
        });
        //多图片上传
        upload.render({
            elem: '#thumbsBanner'
            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
            ,multiple: true
            ,before: function(obj){
                //预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result){
                    $('#thumbsBanners').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">')
                });
            }
            ,done: function(res){
                var thumbs = $("#thumbs").val();
                if(thumbs == ''){
                    $("#thumbs").val(res.data.src);
                }else{
                    $("#thumbs").val(thumbs + ',' + res.data.src);
                }
                // alert($("#thumb").val());
            }
        });
        //图片上传
        upload.render({
            elem: '#test2'
            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
            ,multiple: true
            ,before: function(obj){
                //预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result){
                    $('#demo2').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">')
                });
            }
            ,done: function(res){
                // var thumbs = $("#thumb").val();
                // if(thumbs == ''){
                $("#thumb").val(res.data.src);
                // }else{
                //     $("#thumb").val(thumbs + ',' + res.data.src);
                // }
                // alert($("#thumb").val());
            }
        });
        layedit.set({    //设置图片接口
@@ -175,32 +260,32 @@
                        <div class="layui-input-block layui-form-item item">
                            <div style="float:left" >
                                <div>
                                    <input type="text" class="layui-input" value="` + attrNameVal + `" readonly >
                                    <input type="text" class="layui-input" value="` + attrNameVal + `"  >
                                </div>
                            </div>
                            <div  style="float:left" >
                                <div>
                                    <img class="layui-upload-img" src="` + skuImage + `" style="width: 100px" readonly>
                                    <img class="layui-upload-img" src="` + skuImage + `" style="width: 100px" >
                                </div>
                            </div>
                            <div style="float:left" >
                                <div>
                                    <input type="text" value="` + stockVal + `" placeholder="库存" autocomplete="off" class="layui-input" readonly>
                                    <input type="text" value="` + stockVal + `" placeholder="库存" autocomplete="off" class="layui-input" >
                                </div>
                            </div>
                            <div style="float:left" >
                                <div>
                                    <input type="text" value="` + skuVolume + `" placeholder="销售数量" autocomplete="off" class="layui-input" readonly>
                                    <input type="text" value="` + skuVolume + `" placeholder="销售数量" autocomplete="off" class="layui-input" >
                                </div>
                            </div>
                            <div style="float:left" >
                                <div>
                                    <input type="text" value="` + originalPrice + `" placeholder="原价" autocomplete="off" class="layui-input" readonly>
                                    <input type="text" value="` + originalPrice + `" placeholder="原价" autocomplete="off" class="layui-input" >
                                </div>
                            </div>
                            <div style="float:left" >
                                <div>
                                    <input type="text" value="` + presentPrice + `" placeholder="现价" autocomplete="off" class="layui-input" readonly>
                                    <input type="text" value="` + presentPrice + `" placeholder="现价" autocomplete="off" class="layui-input" >
                                </div>
                            </div>
                        </div>
@@ -214,12 +299,25 @@
            for(var skuIndex = 0; skuIndex < skuLength; skuIndex++){
                appendSku(mailGoodsUpdate.mailGoodsSkuDetailVo[skuIndex],skuIndex);
            }
            //缩略图图片回显
            if(mailGoodsUpdate.thumb != null || mailGoodsUpdate.thumb != ''){
                $('#demo2').append('<img src="'+ mailGoodsUpdate.thumb +'" class="layui-upload-img" style="width: 100px">')
                $("#thumb").val(mailGoodsUpdate.thumb);
            }
            var imagesInitIndex = 0;
            let imagesInitIndexlength = mailGoodsUpdate.mailGoodsImagesVo.length;
            for(var imagesInitIndex = 0; imagesInitIndex < imagesInitIndexlength; imagesInitIndex++){
                console.log(mailGoodsUpdate.mailGoodsImagesVo);
                $('#thumbsBanners').append('<img src="'+ mailGoodsUpdate.mailGoodsImagesVo[imagesInitIndex] +'" class="layui-upload-img" style="width: 100px">')
                $("#thumbs").val(mailGoodsUpdate.mailGoodsImagesVo[imagesInitIndex] + ',');
            }
            form.val("goods-update-form", {
                "id": mailGoodsUpdate.id,
                "goodsNo": mailGoodsUpdate.goodsNo,
                "categoryId": mailGoodsUpdate.categoryId,
                "mailGoodsSkuDetailVo": mailGoodsUpdate.mailGoodsSkuDetailVo,
                "mailGoodsImagesVo": mailGoodsUpdate.mailGoodsImagesVo,
                "unit": mailGoodsUpdate.unit,
                "originalPrice": mailGoodsUpdate.originalPrice,
                "presentPrice": mailGoodsUpdate.presentPrice,
@@ -227,8 +325,133 @@
                "thumb": mailGoodsUpdate.thumb,
                "goodsDetails": mailGoodsUpdate.goodsDetails,
                "isHot": mailGoodsUpdate.isHot,
                "isHot": mailGoodsUpdate.isHot,
                "goodsName": mailGoodsUpdate.goodsName
            });
        }
        $('#test3').on('click', function (){
            var index = $("#attrWrap").children().length;
            let attrNameVal = $('#attrName').val();
            if(attrNameVal==null || attrNameVal==""){
                febs.alert.warn('样式名称不能为空');
                return false;
            }
            $('#attrWrap').append(`
                    <div class="layui-form-item item">
                    <div style="float:left" >
                            <input type="text" name="styleName` + index + `" value="` + $('#attrName').val() + `" autocomplete="off" class="layui-input"  readonly >
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="text" name="skuName` + index +`" placeholder="规格名称" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div  style="float:left" >
                        <label class="layui-form-label">图片:</label>
                        <div class="layui-input-block">
                            <div class="layui-upload">
                                    <button type="button" class="layui-btn layui-btn-normal layui-btn-xs sku-img" id="skuImg` + index + `">上传</button>
                                    <img class="layui-upload-img" id="imageUrls` + index + `" style="width: 100px" >
                            </div>
                        </div>
                    </div>
                    <div style="float:left" class="febs-hide">
                        <div>
                            <input type="text" id="skuImage` + index +`" name="skuImage` + index + `" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="stock` + index +`" placeholder="库存" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="skuVolume` + index +`" placeholder="销售数量" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="originalPrice` + index +`" placeholder="原价" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="presentPrice` + index + `" placeholder="现价" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <button type="button" class="layui-btn del-attr-btn" data-index="` + index +`">删除</button>
                    </div>
                </div>
            `)
            //普通图片上传
            upload.render({
                elem: '#skuImg' + index
                ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
                ,done: function(res){
                    febs.alert.success(res.data.src);
                    $('#imageUrls' + index).attr('src', res.data.src);
                    $('#skuImage'+ index).val(res.data.src);
                }
            });
        });
        upload.render({
            elem: '#skuImg'+index
            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
            ,done: function(res){
                febs.alert.success(res.data.src);
                $('#imageUrls' + index).attr('src', res.data.src);
                $('#skuImage'+ index).val(res.data.src);
            }
        });
        $("#attrWrap").on("click",".del-attr-btn",function(){
            var index = $(this).attr('data-index')
            $($("#attrWrap").find(".item")[index].remove());
        });
        form.on('submit(goods-add-form-submit)', function (data) {
            let skuArrs = [];
            var skuArr = $("#attrWrap").find(".item");
            for(var i = 0;i < skuArr.length;i++){
                skuArrs.push({
                    styleName: $("input[name='styleName" + i + "']").val(),
                    skuName: $("input[name='skuName" + i + "']").val(),
                    skuImage: $("input[name='skuImage" + i + "']").val(),
                    stock: $("input[name='stock" + i + "']").val(),
                    skuVolume: $("input[name='skuVolume" + i + "']").val(),
                    originalPrice:$("input[name='originalPrice" + i + "']").val(),
                    presentPrice: $("input[name='presentPrice" + i + "']").val()
                })
            }
            // if(skuArr.length < 0){
            //     febs.alert.warn("请填写商品规格");
            //     return false;
            // }
            // console.log(skuArrs)
            data.field.addMallGoodsSkuDtos = skuArrs;
            // console.log(data.field)
            $.ajax({
                'url':ctx + 'admin/goods/addMallGoods',
                'type':'post',
                'dataType':'json',
                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
                'traditional': true,//ajax传递数组必须添加属性
                'data':JSON.stringify(data.field),
                'success':function (data) {
                    if(data.code==0){
                        febs.alert.success(data.message);
                        var index = parent.layer.getFrameIndex(window.name);
                        parent.layer.close(index);
                    }else{
                        febs.alert.warn(data.message);
                    }
                },
                'error':function () {
                    febs.alert.warn('服务器繁忙');
                }
            })
            return false;
        });
    });
</script>
src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html
New file
@@ -0,0 +1,521 @@
<style>
    #goods-updatenew {
        padding: 20px 25px 25px 0;
    }
    #goods-updatenew .layui-treeSelect .ztree li a, .ztree li span {
        margin: 0 0 2px 3px !important;
    }
    #goods-updatenew #data-permission-tree-block {
        border: 1px solid #eee;
        border-radius: 2px;
        padding: 3px 0;
    }
    #user-add .layui-treeSelect .ztree li span.button.switch {
        top: 1px;
        left: 3px;
    }
</style>
<div class="layui-fluid" id="goods-updatenew">
    <form class="layui-form" action="" lay-filter="goods-updatenew-form">
        <div class="layui-form-item febs-hide">
            <label class="layui-form-label febs-form-item-require">id:</label>
            <div class="layui-input-block">
                <input type="text" name="id">
            </div>
        </div>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">商品名称:</label>
                <div class="layui-input-block">
                    <input type="text" name="goodsName" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">商品编号:</label>
                <div class="layui-input-block">
                    <input type="text" name="goodsNo" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
                </div>
            </div>
        </div>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">所属分类:</label>
                <div class="layui-input-block">
                    <select name="categoryId" class="categary-goods-updatenew-category" id="goodsUpdateSelect" >
                        <option value="">请选择</option>
                    </select>
                </div>
            </div>
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">单位:</label>
                <div class="layui-input-block">
                    <input type="text" name="unit"  lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
                </div>
            </div>
        </div>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">原价:</label>
                <div class="layui-input-block">
                    <input type="text" name="originalPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">现价:</label>
                <div class="layui-input-block">
                    <input type="text" name="presentPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
                </div>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">商品介绍:</label>
            <div class="layui-input-block">
                <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" >
            </div>
        </div>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">样式:</label>
                <div class="layui-input-block">
                    <input type="text" name="addMallGoodsSkuDtos" autocomplete="off" class="layui-input" id="attrName">
                </div>
            </div>
            <div class="layui-col-lg6">
                <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="test3" >添加</button>
            </div>
        </div>
        <div id="attrWrap"></div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">缩略图:</label>
            <div class="layui-input-block">
                <div class="layui-upload">
                    <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="test2">上传</button>
                    <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
                        <div class="layui-upload-list" id="demo2"></div>
                    </blockquote>
                </div>
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <label class="layui-form-label">缩略图链接:</label>
            <div class="layui-input-block">
                <input type="text" id="thumb" lay-verify="required" name="thumb" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">轮播图:</label>
            <div class="layui-input-block">
                <div class="layui-upload">
                    <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="thumbsBanner">上传</button>
                    <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
                        <div class="layui-upload-list" id="thumbsBanners"></div>
                    </blockquote>
                </div>
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <label class="layui-form-label">缩略图链接:</label>
            <div class="layui-input-block">
                <input type="text" id="thumbs" lay-verify="required" name="thumbs" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">商品详情:</label>
            <div class="layui-input-block">
                <textarea id="lay_edit" lay-verify="goodsDetails" name = "goodsDetails" class="layui-textarea">[[${mailGoodsUpdate.goodsDetails}]]</textarea>
            </div>
        </div>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label">是否热卖:</label>
                <div class="layui-input-block">
                    <input type="radio" name="isHot" value="1" title="是" >
                    <input type="radio" name="isHot" value="2" title="否" checked="">
                </div>
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <button class="layui-btn" lay-submit="" lay-filter="goods-update-form-submit" id="submit"></button>
        </div>
<!--        <div class="layui-form-item">-->
<!--            <div class="layui-form-item"  style="text-align:center">-->
<!--                <button class="layui-btn" lay-submit="" lay-filter="goods-update-form-submit" id="submit">保存</button>-->
<!--            </div>-->
<!--        </div>-->
    </form>
</div>
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate','layedit','upload'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            layer = layui.layer,
            formSelects = layui.formSelects,
            treeSelect = layui.treeSelect,
            form = layui.form,
            laydate = layui.laydate,
            eleTree = layui.eleTree,
            mailGoodsUpdate = [[${mailGoodsUpdate}]],
            $view = $('#goods-add'),
            layedit = layui.layedit,
            upload = layui.upload,
            validate = layui.validate;
        form.render();
        //(下拉框)
        $.get(ctx + 'admin/goodsCategory/categorys/allTree', function (data) {
            for (var k in data)
            {
                $(".categary-goods-updatenew-category").append("<option value='" + data[k].parentId + "'>" + data[k].name + "</option>");
            }
            layui.use('form', function () {
                var form = layui.form;
                $("#goodsUpdateSelect").val(mailGoodsUpdate.categoryId)
                form.render();
            });
        });
        //多图片上传
        upload.render({
            elem: '#thumbsBanner'
            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
            ,multiple: true
            ,before: function(obj){
                //预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result){
                    $('#thumbsBanners').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">')
                });
            }
            ,done: function(res){
                var thumbs = $("#thumbs").val();
                if(thumbs == ''){
                    $("#thumbs").val(res.data.src);
                }else{
                    $("#thumbs").val(thumbs + ',' + res.data.src);
                }
                // alert($("#thumb").val());
            }
        });
        //图片上传
        upload.render({
            elem: '#test2'
            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
            ,multiple: true
            ,before: function(obj){
                //预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result){
                    $('#demo2').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">')
                });
            }
            ,done: function(res){
                // var thumbs = $("#thumb").val();
                // if(thumbs == ''){
                $("#thumb").val(res.data.src);
                // }else{
                //     $("#thumb").val(thumbs + ',' + res.data.src);
                // }
                // alert($("#thumb").val());
            }
        });
        layedit.set({    //设置图片接口
            uploadImage: {
                url: 'admin/goods/uploadFileBase64', //接口url
                type: 'post',
            }
        });
        //创建一个编辑器
        var index = layedit.build('lay_edit',{
            height: 300
        });
        //提交时把值同步到文本域中
        form.verify({
            //content富文本域中的lay-verify值
            goodsDetails: function(value) {
                return layedit.sync(index);
            }
        });
        initUserValue();
        function appendSku(sku,skuIndex){
            var index = skuIndex;
            let attrNameVal = sku.skuName;
            let styleName = sku.styleName;
            let styleId = sku.styleId;
            let skuId = sku.id;
            let stockVal = sku.stock;
            let skuVolume = sku.skuVolume;
            let originalPrice = sku.originalPrice;
            let presentPrice = sku.presentPrice;
            let skuImage = sku.skuImage;
            $('#attrWrap').append(`
                <div class="layui-form-item item">
                    <div class="layui-form-item febs-hide">
                        <label class="layui-form-label febs-form-item-require">id:</label>
                        <div class="layui-input-block">
                            <input type="text" name="id` + index + `" value="` + skuId + `">
                        </div>
                    </div>
                    <div class="layui-form-item febs-hide">
                        <label class="layui-form-label febs-form-item-require">id:</label>
                        <div class="layui-input-block">
                            <input type="text" name="delLog` + index + `">
                        </div>
                    </div>
                    <div class="layui-form-item febs-hide">
                        <label class="layui-form-label febs-form-item-require">styleId:</label>
                        <div class="layui-input-block">
                            <input type="text" id="styleId` + index +`" name="styleId` + index + `" value="` + styleId + `">
                        </div>
                    </div>
                    <div style="float:left" >
                            <input type="text" name="styleName` + index + `" value="` + styleName + `" autocomplete="off" class="layui-input"  readonly >
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="text" name="skuName` + index +`" value="` + attrNameVal + `" placeholder="规格名称" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div  style="float:left" >
                        <label class="layui-form-label">图片:</label>
                        <div class="layui-input-block">
                            <div class="layui-upload">
                                    <button type="button" class="layui-btn layui-btn-normal layui-btn-xs sku-img" id="skuImg` + index + `">上传</button>
                                    <img class="layui-upload-img" src="` + skuImage + `" id="imageUrls` + index + `" style="width: 100px" >
                            </div>
                        </div>
                    </div>
                    <div style="float:left" class="febs-hide">
                        <div>
                            <input type="text" id="skuImage` + index +`" value="` + skuImage + `" name="skuImage` + index + `" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="stock` + index +`" value="` + stockVal + `" placeholder="库存" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="skuVolume` + index +`" value="` + skuVolume + `" placeholder="销售数量" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="originalPrice` + index +`" value="` + originalPrice + `" placeholder="原价" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="presentPrice` + index + `" value="` + presentPrice + `" placeholder="现价" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <button type="button" class="layui-btn del-attr-btn" data-index="` + index +`">删除</button>
                    </div>
                </div>
            `)
            //普通图片上传
            upload.render({
                elem: '#skuImg' + index
                ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
                ,done: function(res){
                    febs.alert.success(res.data.src);
                    $('#imageUrls' + index).attr('src', res.data.src);
                    $('#skuImage'+ index).val(res.data.src);
                }
            });
        }
        function initUserValue() {
            var skuIndex = 0;
            let skuLength = mailGoodsUpdate.mailGoodsSkuDetailVo.length;
            for(var skuIndex = 0; skuIndex < skuLength; skuIndex++){
                appendSku(mailGoodsUpdate.mailGoodsSkuDetailVo[skuIndex],skuIndex);
            }
            //缩略图图片回显
            if(mailGoodsUpdate.thumb != null || mailGoodsUpdate.thumb != ''){
                $('#demo2').append('<img src="'+ mailGoodsUpdate.thumb +'" class="layui-upload-img" style="width: 100px">')
                $("#thumb").val(mailGoodsUpdate.thumb);
            }
            var imagesInitIndex = 0;
            let imagesInitIndexlength = mailGoodsUpdate.mailGoodsImagesVo.length;
            for(var imagesInitIndex = 0; imagesInitIndex < imagesInitIndexlength; imagesInitIndex++){
                console.log(mailGoodsUpdate.mailGoodsImagesVo);
                $('#thumbsBanners').append('<img src="'+ mailGoodsUpdate.mailGoodsImagesVo[imagesInitIndex] +'" class="layui-upload-img" style="width: 100px">')
                $("#thumbs").val(mailGoodsUpdate.mailGoodsImagesVo[imagesInitIndex] + ',');
            }
            form.val("goods-updatenew-form", {
                "id": mailGoodsUpdate.id,
                "goodsNo": mailGoodsUpdate.goodsNo,
                "categoryId": mailGoodsUpdate.categoryId,
                "mailGoodsSkuDetailVo": mailGoodsUpdate.mailGoodsSkuDetailVo,
                "mailGoodsImagesVo": mailGoodsUpdate.mailGoodsImagesVo,
                "unit": mailGoodsUpdate.unit,
                "originalPrice": mailGoodsUpdate.originalPrice,
                "presentPrice": mailGoodsUpdate.presentPrice,
                "goodsIntrodution": mailGoodsUpdate.goodsIntrodution,
                "thumb": mailGoodsUpdate.thumb,
                "goodsDetails": mailGoodsUpdate.goodsDetails,
                "isHot": mailGoodsUpdate.isHot,
                "isHot": mailGoodsUpdate.isHot,
                "goodsName": mailGoodsUpdate.goodsName
            });
        }
        $('#test3').on('click', function (){
            var index = $("#attrWrap").children().length;
            let attrNameVal = $('#attrName').val();
            if(attrNameVal==null || attrNameVal==""){
                febs.alert.warn('样式名称不能为空');
                return false;
            }
            $('#attrWrap').append(`
                <div class="layui-form-item item">
                    <div class="layui-form-item febs-hide">
                        <label class="layui-form-label febs-form-item-require">id:</label>
                        <div class="layui-input-block">
                            <input type="text" name="id` + index + `">
                        </div>
                    </div>
                    <div class="layui-form-item febs-hide">
                        <label class="layui-form-label febs-form-item-require">styleId:</label>
                        <div class="layui-input-block">
                            <input type="text" id="styleId` + index +`" name="styleId` + index + `">
                        </div>
                    </div>
                    <div style="float:left" >
                            <input type="text" name="styleName` + index + `" value="` + $('#attrName').val() + `" autocomplete="off" class="layui-input"  readonly >
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="text" name="skuName` + index +`" placeholder="规格名称" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div  style="float:left" >
                        <label class="layui-form-label">图片:</label>
                        <div class="layui-input-block">
                            <div class="layui-upload">
                                    <button type="button" class="layui-btn layui-btn-normal layui-btn-xs sku-img" id="skuImg` + index + `">上传</button>
                                    <img class="layui-upload-img" id="imageUrls` + index + `" style="width: 100px" >
                            </div>
                        </div>
                    </div>
                    <div style="float:left" class="febs-hide">
                        <div>
                            <input type="text" id="skuImage` + index +`" name="skuImage` + index + `" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="stock` + index +`" placeholder="库存" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="skuVolume` + index +`" placeholder="销售数量" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="originalPrice` + index +`" placeholder="原价" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <div>
                            <input type="number" name="presentPrice` + index + `" placeholder="现价" autocomplete="off" class="layui-input" >
                        </div>
                    </div>
                    <div style="float:left" >
                        <button type="button" class="layui-btn del-attr-btn" data-index="` + index +`">删除</button>
                    </div>
                </div>
            `)
            //普通图片上传
            upload.render({
                elem: '#skuImg' + index
                ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
                ,done: function(res){
                    febs.alert.success(res.data.src);
                    $('#imageUrls' + index).attr('src', res.data.src);
                    $('#skuImage'+ index).val(res.data.src);
                }
            });
        });
        upload.render({
            elem: '#skuImg'+index
            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
            ,done: function(res){
                febs.alert.success(res.data.src);
                $('#imageUrls' + index).attr('src', res.data.src);
                $('#skuImage'+ index).val(res.data.src);
            }
        });
        $("#attrWrap").on("click",".del-attr-btn",function(){
            var index = $(this).attr('data-index')
            if($("input[name='styleId" + index + "']").val() ==null || $("input[name='styleId" + index + "']").val() ==''){
                $($("#attrWrap").find(".item")[index].remove());
            }else{
                $("input[name='delLog" + index + "']").val("delLog");
                $($("#attrWrap").find(".item")[index].style.display = "none");
            }
        });
        form.on('submit(goods-update-form-submit)', function (data) {
            let skuArrs = [];
            var skuArr = $("#attrWrap").find(".item");
            for(var i = 0;i < skuArr.length;i++){
                skuArrs.push({
                    id: $("input[name='id" + i + "']").val(),
                    styleName: $("input[name='styleName" + i + "']").val(),
                    styleId: $("input[name='styleId" + i + "']").val(),
                    delLog: $("input[name='delLog" + i + "']").val(),
                    skuName: $("input[name='skuName" + i + "']").val(),
                    skuImage: $("input[name='skuImage" + i + "']").val(),
                    stock: $("input[name='stock" + i + "']").val(),
                    skuVolume: $("input[name='skuVolume" + i + "']").val(),
                    originalPrice:$("input[name='originalPrice" + i + "']").val(),
                    presentPrice: $("input[name='presentPrice" + i + "']").val()
                })
            }
            // if(skuArr.length < 0){
            //     febs.alert.warn("请填写商品规格");
            //     return false;
            // }
            // console.log(skuArrs)
            data.field.mailGoodsSkuDto = skuArrs;
            console.log(data.field)
            $.ajax({
                'url':ctx + 'admin/goods/updateMallGoods',
                'type':'post',
                'dataType':'json',
                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
                'traditional': true,//ajax传递数组必须添加属性
                'data':JSON.stringify(data.field),
                'success':function (data) {
                    if(data.code==0){
                        layer.closeAll();
                        febs.alert.success('操作成功');
                        // var index = parent.layer.getFrameIndex(window.name);
                        // parent.layer.close(index);
                        // febs.alert.success('操作成功');
                        $('#febs-goods').find('#reset').click();
                    }else{
                        febs.alert.warn(data.message);
                    }
                },
                'error':function () {
                    febs.alert.warn('服务器繁忙');
                }
            })
            return false;
        });
    });
</script>
src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html
@@ -130,6 +130,7 @@
                                return ''
                            }
                        }, minWidth: 80,align:'center'},
                    {field: 'orderNo', title: '订单编号', minWidth: 150,align:'left'},
                    {field: 'createdTime', title: '创建时间', minWidth: 180,align:'center'}
                ]]
            });
src/main/resources/templates/febs/views/modules/order/orderList.html
@@ -206,22 +206,22 @@
                            }, minWidth: 80,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            if(d.payMethod === '支付宝支付' || d.payMethod === '微信支付'){
                                if (d.status === 2) {
                                    return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>'
                                        +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="cancelOrder" shiro:hasPermission="user:update">取消订单</button>'
                                        +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                                }else{
                                    return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                                }
                            }else{
                            // if(d.payMethod === '支付宝支付' || d.payMethod === '微信支付'){
                            //     if (d.status === 2) {
                            //         return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>'
                            //             +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="cancelOrder" shiro:hasPermission="user:update">取消订单</button>'
                            //             +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                            //     }else{
                            //         return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                            //     }
                            // }else{
                                if (d.status === 2) {
                                    return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>'
                                        +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                                }else{
                                    return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                                }
                            }
                            // }
                        },minWidth: 300,align:'center'}
                ]]
            });