Administrator
2025-07-16 46d9a52288d5c36985435e775a8433df4e12000b
feat(mall): 添加自定义打印功能并优化订单相关接口

- 在 ApiClothesOrderServiceImpl 中添加了自定义打印相关的逻辑
- 在 ApiMyDraftVo 和其他相关 VO 类中添加了图片字段- 修改了 ClothesOrderDraftMapper.xml 中的查询顺序
- 在 orderList.html 中添加了自定义打印按钮和相关功能
6 files modified
91 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java 11 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesLocationInfoVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesPatternInfoVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftVo.java 6 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/ClothesOrderDraftMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/clothesType/orderList.html 68 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java
@@ -210,6 +210,8 @@
        ClothesOrderDraft clothesOrderDraft = clothesOrderDraftMapper.selectById(id);
        if (ObjectUtil.isNotNull(clothesOrderDraft)){
            Long draftId = clothesOrderDraft.getId();
            Long typeId = clothesOrderDraft.getTypeId();
            ClothesType clothesType = clothesTypeMapper.selectById(typeId);
            record.setTypeId(typeId);
@@ -226,6 +228,7 @@
                        record.setSizeId(sizeId);
                        record.setSizeName(clothesSize.getName());
                        record.setSizePrice(clothesSize.getPrice());
                        record.setSizeImage(clothesSize.getImage());
                    }
                }
            }
@@ -240,7 +243,7 @@
            BigDecimal totalPatternPrice = BigDecimal.ZERO;
            List<ClothesPatternRemark> clothesPatternRemarks = clothesPatternRemarkMapper.selectList(
                    Wrappers.lambdaQuery(ClothesPatternRemark.class)
                            .eq(ClothesPatternRemark::getSourceId, record.getId())
                            .eq(ClothesPatternRemark::getSourceId, draftId)
                            .eq(ClothesPatternRemark::getType, SocialPatternLocationTypeEnum.DRAFT.getValue())
            );
            if(CollUtil.isNotEmpty(clothesPatternRemarks)){
@@ -253,6 +256,7 @@
                    vo.setPatternName(clothesPattern.getName());
                    vo.setPatternPrice(clothesPattern.getPrice());
                    vo.setPatternRemark(entity.getRemark());
                    vo.setPatternImage(clothesPattern.getImage());
                    vos.add(vo);
                    totalPatternPrice = totalPatternPrice.add(clothesPattern.getPrice());
@@ -263,7 +267,7 @@
            BigDecimal totalLocationPrice = BigDecimal.ZERO;
            List<ClothesLocationRemark> clothesLocationRemarks = clothesLocationRemarkMapper.selectList(
                    Wrappers.lambdaQuery(ClothesLocationRemark.class)
                            .eq(ClothesLocationRemark::getSourceId, record.getId())
                            .eq(ClothesLocationRemark::getSourceId, draftId)
                            .eq(ClothesLocationRemark::getType, SocialPatternLocationTypeEnum.DRAFT.getValue())
            );
            if(CollUtil.isNotEmpty(clothesLocationRemarks)){
@@ -276,6 +280,7 @@
                    vo.setLocationName(location.getName());
                    vo.setLocationPrice(location.getPrice());
                    vo.setLocationRemark(entity.getRemark());
                    vo.setLocationImage(location.getImage());
                    vos.add(vo);
                    totalLocationPrice = totalLocationPrice.add(location.getPrice());
@@ -293,6 +298,7 @@
                        record.setArtId(artId);
                        record.setArtName(clothesArt.getName());
                        record.setArtPrice(clothesArt.getPrice());
                        record.setArtImage(clothesArt.getImage());
                    }
                }
            }
@@ -307,6 +313,7 @@
                        record.setClothId(clothId);
                        record.setClothName(clothesCloth.getName());
                        record.setClothPrice(clothesCloth.getPrice());
                        record.setClothImage(clothesCloth.getImage());
                    }
                }
            }
src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesLocationInfoVo.java
@@ -15,6 +15,8 @@
    private Long locationId;
    @ApiModelProperty(value = "反面图案名称")
    private String locationName;
    @ApiModelProperty(value = "反面图案图片")
    private String locationImage;
    @ApiModelProperty(value = "反面图案价格")
    private BigDecimal locationPrice = BigDecimal.ZERO;
    @ApiModelProperty(value = "反面自定义内容")
src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesPatternInfoVo.java
@@ -15,6 +15,8 @@
    private Long patternId;
    @ApiModelProperty(value = "正面图案名称")
    private String patternName;
    @ApiModelProperty(value = "正面图案图片")
    private String patternImage;
    @ApiModelProperty(value = "正面图案价格")
    private BigDecimal patternPrice = BigDecimal.ZERO;
    @ApiModelProperty(value = "正面自定义内容")
src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftVo.java
@@ -30,6 +30,8 @@
    private String artName;
    @ApiModelProperty(value = "工艺价格")
    private BigDecimal artPrice = BigDecimal.ZERO;
    @ApiModelProperty(value = "工艺图片")
    private String artImage;
    @ApiModelProperty(value = "尺码ID")
    private Long sizeId;
@@ -37,6 +39,8 @@
    private String sizeName;
    @ApiModelProperty(value = "尺码价格")
    private BigDecimal sizePrice = BigDecimal.ZERO;
    @ApiModelProperty(value = "尺码图片")
    private String sizeImage;
    @ApiModelProperty(value = "正面图案")
    private List<ApiClothesPatternInfoVo> patternList;
@@ -52,6 +56,8 @@
    private String clothName;
    @ApiModelProperty(value = "布料价格")
    private BigDecimal clothPrice = BigDecimal.ZERO;
    @ApiModelProperty(value = "布料图片")
    private String clothImage;
    @ApiModelProperty(value = "身材数据ID")
    private Long statureId;
src/main/resources/mapper/modules/ClothesOrderDraftMapper.xml
@@ -10,7 +10,7 @@
        where a.member_id = #{record.memberId}
        and a.del_flag = 0
        and b.state = 1
        order by a.CREATED_TIME asc
        order by a.CREATED_TIME desc
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/clothesType/orderList.html
@@ -100,6 +100,7 @@
</script>
<script type="text/html" id="tableToolBarClothesOrder">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="printSelect">自定义打印</button>
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="deliverGoods">发货</button>
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="updateDeliver">修改物流信息</button>
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="refundOrder">仅退款</button>
@@ -150,6 +151,28 @@
            var layEvent = obj.event;
            var id = obj.config.id;
            var checkStatus = table.checkStatus(id);
            if(layEvent === 'printSelect'){
                let data = checkStatus.data;
                if (data.length > 1) {
                    febs.alert.warn('每次只能操作一个订单');
                    return;
                }
                let ids = "";
                for(let i = 0;i < data.length;i++){
                    console.log(data[i].status);
                    if(data[i].status != 2){
                        febs.alert.warn('请选择待发货的订单');
                        return;
                    }else{
                        ids = data[i].id;
                    }
                }
                if(ids == null || ids == ""){
                    febs.alert.warn('请选择订单');
                    return;
                }
                printSelect(data)
            }
            if (layEvent === 'deliverGoods') {
                let data = checkStatus.data;
@@ -282,6 +305,51 @@
        });
        /*
         * [自定义打印选中行数据]
         * @param  {[type]}  allData [传入选中行]
         */
        function printSelect(allData) {
            //用于包含内容
            var v = document.createElement("div");
            //页面头部,导入css  ,media="print"表示打印时使用该样式
            var f = ["<head>", "<style>", "div{font-size:8px;}", ".main{width:100%;}",
                ".main div{width:100%;display:inline-block;}", "</style>", "</head>"
            ].join("");
            var contentHtml = "";
            for (let i = 0; i < allData.length; i++) {
                let data = allData[i]
                var template =
                    "<div class='main'>" +
                    "<table cellspacing=\"0\" width=\"100%\" style=\"border-collapse: separate; border-spacing: 0px;\">" +
                    "<tr>" +
                    "<td style='width: 50%;'>" +
                    "<img src='" + data.img + "' style='width: 100%;'/>" +
                    "</td>" +
                    "<td style='width: 50%;'>" +
                    "<img src='" + data.img + "' style='width: 100%;'/>" +
                    "</td>" +
                    "</tr>" +
                    "</table>" +
                    "<div style='text-align: center;font-size: 10px;font-weight: bold;margin-bottom: 10px'>订单编号:" + data.orderNo + "</div>" +
                    "</div>"
                contentHtml += template;
            }
            //contentHtml为已拼凑好的内容
            $(v).append(contentHtml)
            //新建窗口
            var h = window.open("打印窗口", "_blank");
            //写入拼凑内容
            h.document.write(f + $(v).prop("outerHTML"));
            //调用打印
            h.print();
            //关闭页面
            h.close();
        }
        function refundOrder(id) {
            febs.get(ctx + 'admin/clothesType/refundOrder/' + id, null, function () {
                febs.alert.success('操作成功');