From bb39438cf1e265940cbead9a223b796986940252 Mon Sep 17 00:00:00 2001 From: xhxu Date: Fri, 18 Aug 2023 18:16:15 +0800 Subject: [PATCH] =?UTF-8?q?//=E7=94=9F=E6=88=90=E7=85=A7=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/migration/V2023080800001_create.sql | 1 + .../UserDigitalAvatarPhotoController.java | 156 +++++++++ .../src/main/resources/application-dev.yml | 1 + .../java/com/iformall/common/ErrorCode.java | 8 + .../iformall/domain/po/UserBasicProperty.java | 6 + .../domain/po/sm/DigitalAvatarMould.java | 6 + .../domain/po/sm/UserDigitalAvatarOrder.java | 86 +++++ .../domain/po/sm/UserDigitalAvatarPhoto.java | 63 ++++ .../enums/EnumDigitalAvatarMouldType.java | 49 +++ .../enums/EnumDigitalAvatarOrderStatus.java | 38 +++ .../enums/EnumDigitalAvatarPhotoStatus.java | 42 +++ .../iformall/enums/EnumPropertyLogType.java | 6 +- .../mapper/UserBasicPropertyMapper.java | 5 +- .../mapper/UserDigitalAvatarOrderMapper.java | 24 ++ .../mapper/UserDigitalAvatarPhotoMapper.java | 22 ++ .../service/UserBasicPropertyService.java | 20 ++ .../impl/UserBasicPropertyServiceImpl.java | 39 ++- .../sm/UserDigitalAvatarOrderService.java | 62 ++++ .../sm/UserDigitalAvatarPhotoService.java | 19 ++ .../UserDigitalAvatarOrderServiceImpl.java | 311 ++++++++++++++++++ .../UserDigitalAvatarPhotoServiceImpl.java | 131 ++++++++ .../iformall/sm/AiDigitalAvatarHelper.java | 107 ++++++ .../java/com/iformall/sm/AiVideoHelper.java | 4 + .../com/iformall/sm/DigitalAvatarParam.java | 18 + .../com/iformall/sm/DigitalAvatarResult.java | 15 + .../java/com/iformall/sm/SuperImgParam.java | 10 + .../java/com/iformall/sm/SuperImgResult.java | 13 + .../java/com/iformall/utils/Base64Util.java | 37 +++ .../mapper/DigitalAvatarMouldMapper.xml | 18 +- .../mapper/UserBasicPropertyMapper.xml | 12 +- .../mapper/UserDigitalAvatarOrderMapper.xml | 111 +++++++ .../mapper/UserDigitalAvatarPhotoMapper.xml | 90 +++++ 32 files changed, 1511 insertions(+), 19 deletions(-) create mode 100644 suimangCApi/src/main/java/com/iformall/controller/UserDigitalAvatarPhotoController.java create mode 100644 suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarOrder.java create mode 100644 suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarPhoto.java create mode 100644 suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarMouldType.java create mode 100644 suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarOrderStatus.java create mode 100644 suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarPhotoStatus.java create mode 100644 suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarOrderMapper.java create mode 100644 suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarPhotoMapper.java create mode 100644 suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarOrderService.java create mode 100644 suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarPhotoService.java create mode 100644 suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarOrderServiceImpl.java create mode 100644 suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarPhotoServiceImpl.java create mode 100644 suimangService/src/main/java/com/iformall/sm/AiDigitalAvatarHelper.java create mode 100644 suimangService/src/main/java/com/iformall/sm/DigitalAvatarParam.java create mode 100644 suimangService/src/main/java/com/iformall/sm/DigitalAvatarResult.java create mode 100644 suimangService/src/main/java/com/iformall/sm/SuperImgParam.java create mode 100644 suimangService/src/main/java/com/iformall/sm/SuperImgResult.java create mode 100644 suimangService/src/main/resources/mapper/UserDigitalAvatarOrderMapper.xml create mode 100644 suimangService/src/main/resources/mapper/UserDigitalAvatarPhotoMapper.xml diff --git a/suimangAdmin/src/main/resources/db/migration/V2023080800001_create.sql b/suimangAdmin/src/main/resources/db/migration/V2023080800001_create.sql index c7ab91c..2a74017 100644 --- a/suimangAdmin/src/main/resources/db/migration/V2023080800001_create.sql +++ b/suimangAdmin/src/main/resources/db/migration/V2023080800001_create.sql @@ -41,6 +41,7 @@ CREATE TABLE `user_basic_property_log` ( user_basic_image +user_digital_avatar_photo product product_order diff --git a/suimangCApi/src/main/java/com/iformall/controller/UserDigitalAvatarPhotoController.java b/suimangCApi/src/main/java/com/iformall/controller/UserDigitalAvatarPhotoController.java new file mode 100644 index 0000000..e74eb7f --- /dev/null +++ b/suimangCApi/src/main/java/com/iformall/controller/UserDigitalAvatarPhotoController.java @@ -0,0 +1,156 @@ +package com.iformall.controller; + +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.PageInfo; +import com.iformall.annotation.AuthIgnore; +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.domain.po.base.BaseEntity; +import com.iformall.domain.po.sm.*; +import com.iformall.enums.*; +import com.iformall.exception.MallinkException; +import com.iformall.service.sm.*; +import com.iformall.video.VideoFactory; +import com.iformall.video.entity.VideUploadResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.SneakyThrows; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.List; + + +@RestController +@RequestMapping("/api/digitalAvatarPhoto") +@Api(description = "模板接口") +public class UserDigitalAvatarPhotoController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private UserDigitalAvatarOrderService userDigitalAvatarOrderService; + + @Autowired + private UserDigitalAvatarPhotoService userDigitalAvatarPhotoService; + + @ApiOperation("制作照片") + @PostMapping("createPhoto") + public ResultData createPhoto(@RequestBody UserDigitalAvatarOrder record) { + logger.debug("[" + getIpAddr() + "] UserDigitalAvatarPhotoController::createPhoto"); + record.setUserId(getMemberId()); + if(record.getId() != null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数异常"); + } + if(record.getDigitalAvatarId() == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"风格模板为空"); + } + return userDigitalAvatarOrderService.createOrder(record); + } + + @ApiOperation("重复制作照片") + @PostMapping("createPhotoAgain") + public ResultData createPhotoAgain(@RequestBody UserDigitalAvatarOrder record) { + logger.debug("[" + getIpAddr() + "] UserDigitalAvatarPhotoController::createPhotoAgain"); + if(record.getId() == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数异常"); + } + record.setUserId(getMemberId()); + UserDigitalAvatarOrder userDigitalAvatarOrder = userDigitalAvatarOrderService.selectById(record.getId()); + if(userDigitalAvatarOrder == null || !record.getUserId().equals(userDigitalAvatarOrder.getUserId())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未查询到订单"); + } + + return userDigitalAvatarOrderService.createPhotoAgain(userDigitalAvatarOrder); + } + + @ApiOperation("根据id查询接口") + @GetMapping("/findById") + @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) + public ResultData findById(Long id) { + logger.debug("[" + getIpAddr() + "] UserDigitalAvatarPhotoController::findById"); + if(id == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空"); + } + UserDigitalAvatarOrder userDigitalAvatarOrder = userDigitalAvatarOrderService.getById(id); + if(userDigitalAvatarOrder == null || !getMemberId().equals(userDigitalAvatarOrder.getUserId())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未查询到订单"); + } + + return new ResultData(userDigitalAvatarOrder); + } + + @ApiOperation("分页列表接口") + @GetMapping("list") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData list(@ModelAttribute UserDigitalAvatarOrder record, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] UserDigitalAvatarPhotoController::list"); + if (record == null) record = new UserDigitalAvatarOrder(); + record.setUserId(getMemberId()); + record.setSortColumns(BaseEntity.SortField.UpdateDate_DESC); + final PageInfo page = userDigitalAvatarOrderService.cListAsPage(record, pageNum, pageSize); + return new ResultData(page); + } + + @ApiOperation("根据id删除接口") + @PostMapping("/delete") + public ResultData delete(@RequestBody UserDigitalAvatarOrder record) { + logger.debug("[" + getIpAddr() + "] UserDigitalAvatarPhotoController::delete"); + if(record.getId() == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空"); + } + UserDigitalAvatarOrder userDigitalAvatarOrder = userDigitalAvatarOrderService.selectById(record.getId()); + if(userDigitalAvatarOrder == null || !getMemberId().equals(userDigitalAvatarOrder.getUserId())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未查询到订单"); + } + userDigitalAvatarOrderService.deleteById(record.getId()); + return new ResultData(); + } + + @ApiOperation("照片超分") + @PostMapping("/photoSupper") + public ResultData photoSupper(@RequestBody UserDigitalAvatarPhoto record) { + logger.debug("[" + getIpAddr() + "] UserDigitalAvatarPhotoController::photoSupper"); + if(record.getId() == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空"); + } + record.setUserId(getMemberId()); + UserDigitalAvatarPhoto userDigitalAvatarPhoto = userDigitalAvatarPhotoService.selectById(record.getId()); + if(userDigitalAvatarPhoto == null || !record.getUserId().equals(userDigitalAvatarPhoto.getUserId())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未查询到照片"); + } + return userDigitalAvatarPhotoService.createPhotoSupper(userDigitalAvatarPhoto); + } + + @ApiOperation("获取视频是否生成成功") + @GetMapping("/getPhoto") + @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) + public ResultData getPhoto(Long id) { + logger.debug("[" + getIpAddr() + "] UserDigitalAvatarPhotoController::photoSupper"); + if(id == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空"); + } + UserDigitalAvatarPhoto userDigitalAvatarPhoto = userDigitalAvatarPhotoService.selectById(id); + if(userDigitalAvatarPhoto == null || !getMemberId().equals(userDigitalAvatarPhoto.getUserId())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未查询到订单"); + } + return new ResultData(userDigitalAvatarPhoto); + } +} diff --git a/suimangCApi/src/main/resources/application-dev.yml b/suimangCApi/src/main/resources/application-dev.yml index 5d68d37..e6e5c53 100644 --- a/suimangCApi/src/main/resources/application-dev.yml +++ b/suimangCApi/src/main/resources/application-dev.yml @@ -192,4 +192,5 @@ photo: url: http://111.198.0.15:22299 hy_url: http://111.198.0.15:22288 talk: http://nas.pucao.cn:2001 + digital_avatar: http://nas.pucao.cn:2003 callbackUrl: https://phototest.metavatar.cc/C diff --git a/suimangService/src/main/java/com/iformall/common/ErrorCode.java b/suimangService/src/main/java/com/iformall/common/ErrorCode.java index 596eb46..597e91e 100644 --- a/suimangService/src/main/java/com/iformall/common/ErrorCode.java +++ b/suimangService/src/main/java/com/iformall/common/ErrorCode.java @@ -449,6 +449,9 @@ public enum ErrorCode{ MEM_MONTH_IS_USED(13105, "该用户本月已领取或未到领取条件"), + GLOD_NOT_ENOUGH(13200, "金币不足"), + + /** * 标签 */ @@ -669,6 +672,11 @@ public enum ErrorCode{ TTCOUPON_IS_EMPTY(63000, "课程不存在"), TTCOUPON_IS_TAKE_OFF(63001, "课程不在上架状态"), + /** + * mould + */ + ORDER_CREAT_OVERRUN(64000, "重复生成次数超限"), + ; private int code; diff --git a/suimangService/src/main/java/com/iformall/domain/po/UserBasicProperty.java b/suimangService/src/main/java/com/iformall/domain/po/UserBasicProperty.java index fca841e..1824b23 100644 --- a/suimangService/src/main/java/com/iformall/domain/po/UserBasicProperty.java +++ b/suimangService/src/main/java/com/iformall/domain/po/UserBasicProperty.java @@ -27,4 +27,10 @@ public class UserBasicProperty extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value="",name="updateDate") private Date updateDate; + @TableField(exist = false) + private Integer addGlod; + + @TableField(exist = false) + private Integer reduceGlod; + } diff --git a/suimangService/src/main/java/com/iformall/domain/po/sm/DigitalAvatarMould.java b/suimangService/src/main/java/com/iformall/domain/po/sm/DigitalAvatarMould.java index b4a1c81..3dcc1c8 100644 --- a/suimangService/src/main/java/com/iformall/domain/po/sm/DigitalAvatarMould.java +++ b/suimangService/src/main/java/com/iformall/domain/po/sm/DigitalAvatarMould.java @@ -85,9 +85,15 @@ public class DigitalAvatarMould extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value="购买须知",name="remark") private String remark; + @io.swagger.annotations.ApiModelProperty(value="EnumDigitalAvatarMouldType",name="mouldType") + private Integer mouldType; + @io.swagger.annotations.ApiModelProperty(value="模板第三方Id",name="mouldSmId") private String mouldSmId; + @io.swagger.annotations.ApiModelProperty(value="重试次数",name="againCount") + private Integer againCount; + @io.swagger.annotations.ApiModelProperty(value="EnumaMouldPatchStatus 状态",name="status") private Integer status; @io.swagger.annotations.ApiModelProperty(value="上架时间",name="putonDate") diff --git a/suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarOrder.java b/suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarOrder.java new file mode 100644 index 0000000..c18e985 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarOrder.java @@ -0,0 +1,86 @@ +package com.iformall.domain.po.sm; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.iformall.common.SortColumn; +import com.iformall.domain.po.base.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.apache.commons.lang3.StringUtils; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@TableName(value = "user_digital_avatar_order") +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class UserDigitalAvatarOrder extends TenantEntity { + + protected Long id; + + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-创建起始时间",name="startDate") + private Date startDate; + + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-创建结束时间",name="endDate") + private Date endDate; + + @io.swagger.annotations.ApiModelProperty(value="订单id",name="orderId") + private Long orderId; + + @io.swagger.annotations.ApiModelProperty(value="用户Id",name="userId") + private Long userId; + + @io.swagger.annotations.ApiModelProperty(value="",name="userImages") + private String userImages; + + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="",name="userImageList") + private List userImageList; + + public List getUserImageList(){ + if(StringUtils.isNotBlank(userImages)){ + try{ + return JSONObject.parseArray(userImages, String.class); + }catch(Exception e){ + } + } + return new ArrayList(); + } + + + @io.swagger.annotations.ApiModelProperty(value="",name="digitalAvatarId") + private Long digitalAvatarId; + @io.swagger.annotations.ApiModelProperty(value="EnumDigitalAvatarMouldType",name="digitalAvatarType") + private Integer digitalAvatarType; + @io.swagger.annotations.ApiModelProperty(value="模板",name="digitalAvatarSm") + private String digitalAvatarSm; + + @io.swagger.annotations.ApiModelProperty(value="原价",name="price") + private Integer price; + + @io.swagger.annotations.ApiModelProperty(value="名称",name="title") + private String title; + + @io.swagger.annotations.ApiModelProperty(value="",name="remark") + private String remark; + + @io.swagger.annotations.ApiModelProperty(value="EnumDigitalAvatarOrderStatus 状态",name="status") + private Integer status; + @io.swagger.annotations.ApiModelProperty(value="",name="msg") + private String msg; + + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") + private Date createDate; + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; + + private List photoList; + +} diff --git a/suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarPhoto.java b/suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarPhoto.java new file mode 100644 index 0000000..d3ad4fa --- /dev/null +++ b/suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarPhoto.java @@ -0,0 +1,63 @@ +package com.iformall.domain.po.sm; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.iformall.common.SortColumn; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.enums.EnumSpeakType; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.apache.commons.lang3.StringUtils; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@TableName(value = "user_digital_avatar_photo") +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class UserDigitalAvatarPhoto extends TenantEntity { + + protected Long id; + + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-创建起始时间",name="startDate") + private Date startDate; + + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-创建结束时间",name="endDate") + private Date endDate; + + @io.swagger.annotations.ApiModelProperty(value="UserDigitalAvatarOrder.id",name="orderId") + private Long orderId; + + @io.swagger.annotations.ApiModelProperty(value="用户Id",name="userId") + private Long userId; + + @io.swagger.annotations.ApiModelProperty(value="",name="image") + private String image; + + @io.swagger.annotations.ApiModelProperty(value="原价",name="price") + private Integer price; + + @io.swagger.annotations.ApiModelProperty(value="",name="remark") + private String remark; + + @io.swagger.annotations.ApiModelProperty(value="",name="imageSuper") + private String imageSuper; + + @io.swagger.annotations.ApiModelProperty(value="EnumDigitalAvatarPhotoStatus 状态",name="status") + private Integer status; + @io.swagger.annotations.ApiModelProperty(value="",name="msg") + private String msg; + + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") + private Date createDate; + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; + +} diff --git a/suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarMouldType.java b/suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarMouldType.java new file mode 100644 index 0000000..eee1551 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarMouldType.java @@ -0,0 +1,49 @@ +package com.iformall.enums; + +import java.util.ArrayList; +import java.util.List; + +/** + * + */ +public enum EnumDigitalAvatarMouldType { + + persion_1(1, "一人模板"), + persion_2(2, "二人模板"), + persion_3(3, "三人模板"), + ; + + public static EnumDigitalAvatarMouldType getEnum(Integer code) { + for (EnumDigitalAvatarMouldType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + public static List getAllCodes(){ + List codes = new ArrayList<>(); + for (EnumDigitalAvatarMouldType value : values()) { + codes.add(value.getCode()); + } + return codes; + } + + private Integer code; + private String message; + + EnumDigitalAvatarMouldType(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } + +} diff --git a/suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarOrderStatus.java b/suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarOrderStatus.java new file mode 100644 index 0000000..36b92fe --- /dev/null +++ b/suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarOrderStatus.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * + */ +public enum EnumDigitalAvatarOrderStatus { + + wait(1, "待制作"), + finish(2, "制作完成"), + fail(3, "制作失败"), + ; + + public static EnumDigitalAvatarOrderStatus getEnum(Integer code) { + for (EnumDigitalAvatarOrderStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumDigitalAvatarOrderStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } + +} diff --git a/suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarPhotoStatus.java b/suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarPhotoStatus.java new file mode 100644 index 0000000..b7c20ca --- /dev/null +++ b/suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarPhotoStatus.java @@ -0,0 +1,42 @@ +package com.iformall.enums; + +import java.util.ArrayList; +import java.util.List; + +/** + * + */ +public enum EnumDigitalAvatarPhotoStatus { + + def(0, "默认"), + wait(1, "待超分"), + finish(2, "超分完成"), + fail(3, "超分失败"), + ; + + public static EnumDigitalAvatarPhotoStatus getEnum(Integer code) { + for (EnumDigitalAvatarPhotoStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumDigitalAvatarPhotoStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } + +} diff --git a/suimangService/src/main/java/com/iformall/enums/EnumPropertyLogType.java b/suimangService/src/main/java/com/iformall/enums/EnumPropertyLogType.java index e954419..a68a831 100644 --- a/suimangService/src/main/java/com/iformall/enums/EnumPropertyLogType.java +++ b/suimangService/src/main/java/com/iformall/enums/EnumPropertyLogType.java @@ -8,7 +8,11 @@ public enum EnumPropertyLogType { REGISTER(1,"注册"), INVITE(2,"邀请"), RECHARGE(3, "充值"), - CONSUMPTION(4, "消费"), + +// CONSUMPTION(4, "消费"), + //智象 + CONSUMPTION_10(10, "生成照片"), + CONSUMPTION_11(11, "照片超分"), ; public static EnumPropertyLogType getEnum(Integer code) { diff --git a/suimangService/src/main/java/com/iformall/mapper/UserBasicPropertyMapper.java b/suimangService/src/main/java/com/iformall/mapper/UserBasicPropertyMapper.java index 6ab56b9..47d89d4 100644 --- a/suimangService/src/main/java/com/iformall/mapper/UserBasicPropertyMapper.java +++ b/suimangService/src/main/java/com/iformall/mapper/UserBasicPropertyMapper.java @@ -9,5 +9,8 @@ public interface UserBasicPropertyMapper extends CommonMapper findList(UserBasicProperty record); - int addGlod(UserBasicProperty userBasicProperty); + int addGlod(UserBasicProperty record); + + int reduceGlod(UserBasicProperty record); + } diff --git a/suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarOrderMapper.java b/suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarOrderMapper.java new file mode 100644 index 0000000..a3a0e56 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarOrderMapper.java @@ -0,0 +1,24 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.sm.UserDigitalAvatarOrder; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserDigitalAvatarOrderMapper extends CommonMapper { + + List findList(UserDigitalAvatarOrder record); + + int deleteById(@Param("id")Long id); + + /** + * c端列表查询,尽量减少字段 + * @param record + * @return + */ + List findCList(UserDigitalAvatarOrder record); + + int findCount(@Param("orderId")Long orderId); + +} diff --git a/suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarPhotoMapper.java b/suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarPhotoMapper.java new file mode 100644 index 0000000..463d4ad --- /dev/null +++ b/suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarPhotoMapper.java @@ -0,0 +1,22 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.sm.UserDigitalAvatarPhoto; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserDigitalAvatarPhotoMapper extends CommonMapper { + + List findList(UserDigitalAvatarPhoto record); + + int deleteById(@Param("id")Long id); + + /** + * c端列表查询,尽量减少字段 + * @param record + * @return + */ + List findCList(UserDigitalAvatarPhoto record); + +} diff --git a/suimangService/src/main/java/com/iformall/service/UserBasicPropertyService.java b/suimangService/src/main/java/com/iformall/service/UserBasicPropertyService.java index 78886ba..ca2aa0f 100644 --- a/suimangService/src/main/java/com/iformall/service/UserBasicPropertyService.java +++ b/suimangService/src/main/java/com/iformall/service/UserBasicPropertyService.java @@ -4,6 +4,8 @@ import com.github.pagehelper.PageInfo; import com.iformall.domain.po.ProductOrder; import com.iformall.domain.po.UserBasicProperty; +import java.util.Date; + public interface UserBasicPropertyService { /** @@ -16,6 +18,24 @@ public interface UserBasicPropertyService { */ PageInfo listAsPage(UserBasicProperty record, Integer pageIndex, Integer pageSize); + /** + * 充值 + * @param userId + * @param projectType + * @param extraId + * @param glod + */ void addRechargeGlod(Long userId, Integer projectType, Long extraId, Integer glod); + /** + * 消费 + * @param userId + * @param projectType + * @param propertyLogType + * @param glod + * @param extraId + * @param now + */ + void consumptionGlod(Long userId, Integer projectType, Integer propertyLogType, Integer glod, Long extraId, Date now); + } diff --git a/suimangService/src/main/java/com/iformall/service/impl/UserBasicPropertyServiceImpl.java b/suimangService/src/main/java/com/iformall/service/impl/UserBasicPropertyServiceImpl.java index b1ba150..0c36f35 100644 --- a/suimangService/src/main/java/com/iformall/service/impl/UserBasicPropertyServiceImpl.java +++ b/suimangService/src/main/java/com/iformall/service/impl/UserBasicPropertyServiceImpl.java @@ -69,8 +69,7 @@ public class UserBasicPropertyServiceImpl implements UserBasicPropertyService { }else{ befourGold = userBasicProperty.getDigitalAvatarResidueGlod(); - userBasicProperty.setDigitalAvatarGlod(glod); - userBasicProperty.setDigitalAvatarResidueGlod(glod); + userBasicProperty.setAddGlod(glod); userBasicProperty.setUpdateDate(now); userBasicPropertyMapper.addGlod(userBasicProperty); } @@ -86,10 +85,44 @@ public class UserBasicPropertyServiceImpl implements UserBasicPropertyService { userBasicPropertyLog.setExtraId(extraId); userBasicPropertyLog.setCreateDate(now); userBasicPropertyLogMapper.insert(userBasicPropertyLog); - } } + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public void consumptionGlod(Long userId, Integer projectType, Integer propertyLogType, Integer glod, Long extraId, Date now) { + WxCUserBasicInfo basicInfo = wxCUserBasicInfoMapper.selectById(userId); + if(basicInfo == null){ + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + UserBasicProperty userBasicProperty = userBasicPropertyMapper.selectById(userId); + if(userBasicProperty == null || userBasicProperty.getDigitalAvatarResidueGlod() < glod){ + throw new MallinkException(ErrorCode.GLOD_NOT_ENOUGH); + } + UserBasicProperty updProperty = new UserBasicProperty(); + updProperty.setId(userId); + updProperty.setReduceGlod(glod); + updProperty.setUpdateDate(now); + int count = userBasicPropertyMapper.reduceGlod(updProperty); + if(count != 1){ + throw new MallinkException(ErrorCode.GLOD_NOT_ENOUGH.getCode(),"扣减异常"); + } + + UserBasicPropertyLog userBasicPropertyLog = new UserBasicPropertyLog(); + final IdWorker idWorker = IdWorker.get(); + userBasicPropertyLog.setId(idWorker.nextId()); + userBasicPropertyLog.setUserId(userId); + userBasicPropertyLog.setProjectType(projectType); + userBasicPropertyLog.setType(propertyLogType); + userBasicPropertyLog.setBefourGold(userBasicProperty.getDigitalAvatarResidueGlod()); + userBasicPropertyLog.setGoldNum(glod); + userBasicPropertyLog.setAfterGold(userBasicProperty.getDigitalAvatarResidueGlod()-glod); + userBasicPropertyLog.setExtraId(extraId); + userBasicPropertyLog.setCreateDate(now); + userBasicPropertyLogMapper.insert(userBasicPropertyLog); + + } + } diff --git a/suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarOrderService.java b/suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarOrderService.java new file mode 100644 index 0000000..f89a69a --- /dev/null +++ b/suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarOrderService.java @@ -0,0 +1,62 @@ +package com.iformall.service.sm; + +import com.github.pagehelper.PageInfo; +import com.iformall.common.ResultData; +import com.iformall.domain.po.sm.UserDigitalAvatarOrder; +import com.iformall.domain.po.sm.UserDigitalAvatarPhoto; + +import java.util.List; +import java.util.concurrent.Future; + +public interface UserDigitalAvatarOrderService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(UserDigitalAvatarOrder record, Integer pageIndex, Integer pageSize); + PageInfo cListAsPage(UserDigitalAvatarOrder record, Integer pageIndex, Integer pageSize); + + List findList(UserDigitalAvatarOrder record); + + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + UserDigitalAvatarOrder selectById(Long id); + UserDigitalAvatarOrder getById(Long id); + + /** + * + * @param record + */ + ResultData createOrder(UserDigitalAvatarOrder record); + + ResultData createPhotoAgain(UserDigitalAvatarOrder record); + + + /** + * 保存或更新实体 + * + * @param record + */ + void handleOrder(UserDigitalAvatarOrder record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + void createPhoto(UserDigitalAvatarOrder record); + + +} diff --git a/suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarPhotoService.java b/suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarPhotoService.java new file mode 100644 index 0000000..0ac1b58 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarPhotoService.java @@ -0,0 +1,19 @@ +package com.iformall.service.sm; + +import com.github.pagehelper.PageInfo; +import com.iformall.common.ResultData; +import com.iformall.domain.po.sm.UserDigitalAvatarPhoto; + +import java.util.List; + +public interface UserDigitalAvatarPhotoService { + + UserDigitalAvatarPhoto selectById(Long id); + + ResultData createPhotoSupper(UserDigitalAvatarPhoto record); + + void handleCreateSupper(UserDigitalAvatarPhoto record); + + void superPhoto(UserDigitalAvatarPhoto record); + +} diff --git a/suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarOrderServiceImpl.java b/suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarOrderServiceImpl.java new file mode 100644 index 0000000..ba9eef5 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarOrderServiceImpl.java @@ -0,0 +1,311 @@ +package com.iformall.service.sm.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.ResultData; +import com.iformall.domain.po.UserBasicProperty; +import com.iformall.domain.po.sm.DigitalAvatarMould; +import com.iformall.domain.po.sm.UserDigitalAvatarOrder; +import com.iformall.domain.po.sm.UserDigitalAvatarPhoto; +import com.iformall.enums.*; +import com.iformall.exception.MallinkException; +import com.iformall.file.aliyun.AliyunOSS; +import com.iformall.mapper.*; +import com.iformall.service.UserBasicPropertyService; +import com.iformall.service.impl.ProductOrderServiceImpl; +import com.iformall.service.sm.UserDigitalAvatarOrderService; +import com.iformall.service.sm.UserDigitalAvatarPhotoService; +import com.iformall.sm.*; +import com.iformall.utils.Base64Util; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.io.InputStream; +import java.util.Date; +import java.util.List; +import java.util.concurrent.Future; + + +@Service +public class UserDigitalAvatarOrderServiceImpl implements UserDigitalAvatarOrderService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + UserDigitalAvatarOrderMapper userDigitalAvatarOrderMapper; + + @Autowired + UserDigitalAvatarPhotoMapper userDigitalAvatarPhotoMapper; + + @Autowired + DigitalAvatarMouldMapper digitalAvatarMouldMapper; + + @Autowired + UserBasicPropertyMapper userBasicPropertyMapper; + + @Autowired + UserBasicPropertyService userBasicPropertyService; + + @Autowired + private AliyunOSS aliyunOSS; + + + private void handleOrderPhoto(List list){ + if(list == null || list.isEmpty()){ + return; + } + for (UserDigitalAvatarOrder order: list) { + if(EnumDigitalAvatarOrderStatus.finish.getCode().equals(order.getStatus())){ + UserDigitalAvatarPhoto userDigitalAvatarPhotoQ = new UserDigitalAvatarPhoto(); + userDigitalAvatarPhotoQ.setOrderId(order.getId()); + List photoList = userDigitalAvatarPhotoMapper.findCList(userDigitalAvatarPhotoQ); + order.setPhotoList(photoList); + } + } + } + + @Override + public PageInfo listAsPage(UserDigitalAvatarOrder record, Integer pageIndex, Integer pageSize) { + PageInfo pageInfo = PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> userDigitalAvatarOrderMapper.findList(record)); + handleOrderPhoto(pageInfo.getList()); + return pageInfo; + } + + @Override + public PageInfo cListAsPage(UserDigitalAvatarOrder record, Integer pageIndex, Integer pageSize) { + PageInfo pageInfo = PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> userDigitalAvatarOrderMapper.findCList(record)); + handleOrderPhoto(pageInfo.getList()); + return pageInfo; + } + + @Override + public List findList(UserDigitalAvatarOrder record) { + return userDigitalAvatarOrderMapper.findList(record); + } + + @Override + public UserDigitalAvatarOrder selectById(Long id) { + return userDigitalAvatarOrderMapper.selectById(id); + } + + @Override + public UserDigitalAvatarOrder getById(Long id) { + UserDigitalAvatarOrder userDigitalAvatarOrder = userDigitalAvatarOrderMapper.selectById(id); + if(userDigitalAvatarOrder != null && EnumDigitalAvatarOrderStatus.finish.getCode().equals(userDigitalAvatarOrder.getStatus())){ + UserDigitalAvatarPhoto userDigitalAvatarPhotoQ = new UserDigitalAvatarPhoto(); + userDigitalAvatarPhotoQ.setOrderId(userDigitalAvatarOrder.getId()); + List photoList = userDigitalAvatarPhotoMapper.findList(userDigitalAvatarPhotoQ); + userDigitalAvatarOrder.setPhotoList(photoList); + } + return userDigitalAvatarOrder; + } + + @Override + public ResultData createOrder(UserDigitalAvatarOrder record) { + if(record.getUserId() == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未查询到用户"); + } + if(record.getDigitalAvatarId() == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"风格模板为空"); + } + if(StringUtils.isBlank(record.getUserImages())){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"照片为空"); + } + if(record.getUserImageList() == null || record.getUserImageList().isEmpty()){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"照片格式错误"); + } + DigitalAvatarMould digitalAvatarMould = digitalAvatarMouldMapper.selectById(record.getDigitalAvatarId()); + if(digitalAvatarMould == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未查询到风格模板信息"); + } + record.setDigitalAvatarSm(digitalAvatarMould.getMouldSmId()); + record.setDigitalAvatarType(digitalAvatarMould.getMouldType()); + record.setPrice(digitalAvatarMould.getSalePrice()); + if(record.getUserImageList().size() != record.getDigitalAvatarType()){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"照片格式错误"); + } + + if(record.getPrice() > 0){ + UserBasicProperty userBasicProperty = userBasicPropertyMapper.selectById(record.getUserId()); + if(userBasicProperty == null || userBasicProperty.getDigitalAvatarResidueGlod() < record.getPrice()){ + return new ResultData(ErrorCode.GLOD_NOT_ENOUGH); + } + } + try{ + UserDigitalAvatarOrderServiceImpl proxy = (UserDigitalAvatarOrderServiceImpl) AopContext.currentProxy(); + proxy.handleOrder(record); + + proxy.createPhoto(record); + return new ResultData(record); + }catch(MallinkException e){ + return new ResultData(e.getErrorCode(),e.getMessage()); + }catch(Exception e){ + return new ResultData(ErrorCode.SYS_SERVER_ERROR); + } + } + + @Override + public ResultData createPhotoAgain(UserDigitalAvatarOrder record) { + if(!EnumDigitalAvatarOrderStatus.finish.getCode().equals(record.getStatus())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"订单状态异常"); + } + DigitalAvatarMould digitalAvatarMould = digitalAvatarMouldMapper.selectById(record.getDigitalAvatarId()); + if(digitalAvatarMould == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"未查询到风格模板信息"); + } + + int count = userDigitalAvatarOrderMapper.findCount(record.getOrderId()); + if(count >= digitalAvatarMould.getAgainCount()){ + return new ResultData(ErrorCode.ORDER_CREAT_OVERRUN); + } + Date now = new Date(); + final IdWorker idWorker = IdWorker.get(); + UserDigitalAvatarOrder newDigitalAvatarOrder = new UserDigitalAvatarOrder(); + newDigitalAvatarOrder.setId(idWorker.nextId()); + newDigitalAvatarOrder.setOrderId(record.getOrderId()); + newDigitalAvatarOrder.setUserId(record.getUserId()); + newDigitalAvatarOrder.setUserImages(record.getUserImages()); + newDigitalAvatarOrder.setDigitalAvatarId(record.getDigitalAvatarId()); + newDigitalAvatarOrder.setDigitalAvatarType(record.getDigitalAvatarType()); + newDigitalAvatarOrder.setDigitalAvatarSm(record.getDigitalAvatarSm()); + newDigitalAvatarOrder.setPrice(0); + newDigitalAvatarOrder.setTitle(record.getTitle()); + newDigitalAvatarOrder.setStatus(EnumDigitalAvatarOrderStatus.wait.getCode()); + newDigitalAvatarOrder.setCreateDate(now); + newDigitalAvatarOrder.setUpdateDate(now); + userDigitalAvatarOrderMapper.insert(newDigitalAvatarOrder); + + try{ + UserDigitalAvatarOrderServiceImpl proxy = (UserDigitalAvatarOrderServiceImpl) AopContext.currentProxy(); + + proxy.createPhoto(record); + return new ResultData(record); + }catch(MallinkException e){ + return new ResultData(e.getErrorCode(),e.getMessage()); + }catch(Exception e){ + return new ResultData(ErrorCode.SYS_SERVER_ERROR); + } + + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public void handleOrder(UserDigitalAvatarOrder record) { + Date now = new Date(); + if(record.getPrice() > 0){ + userBasicPropertyService.consumptionGlod(record.getUserId(),EnumProject.PROJECT_5.getCode(), EnumPropertyLogType.CONSUMPTION_10.getCode(), + record.getPrice(),record.getId(),now); + } + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + record.setOrderId(record.getId()); + record.setStatus(EnumDigitalAvatarOrderStatus.wait.getCode()); + record.setCreateDate(now); + record.setUpdateDate(now); + userDigitalAvatarOrderMapper.insert(record); + } + + @Override + public void deleteById(Long id) { + userDigitalAvatarOrderMapper.deleteById(id); + } + + @Async + @Override + public void createPhoto(UserDigitalAvatarOrder record){ + if(EnumDigitalAvatarOrderStatus.finish.getCode().equals(record.getStatus())){ + return; + } + UserDigitalAvatarOrder updOrder = new UserDigitalAvatarOrder(); + updOrder.setId(record.getId()); + try{ + DigitalAvatarParam param = new DigitalAvatarParam(); + param.setBg_img(record.getDigitalAvatarSm()); + if(EnumDigitalAvatarMouldType.persion_1.getCode().equals(record.getDigitalAvatarType())){ + String imgUrl1 = record.getUserImageList().get(0); + param.setImg_lift(Base64Util.imageUrlToBase64(imgUrl1)); + param.setImg_middle("None"); + param.setImg_right("None"); + }else if(EnumDigitalAvatarMouldType.persion_2.getCode().equals(record.getDigitalAvatarType())){ + String imgUrl1 = record.getUserImageList().get(0); + String imgUrl2 = record.getUserImageList().get(1); + param.setImg_lift(Base64Util.imageUrlToBase64(imgUrl1)); + param.setImg_middle("None"); + param.setImg_right(Base64Util.imageUrlToBase64(imgUrl2)); + }else if(EnumDigitalAvatarMouldType.persion_3.getCode().equals(record.getDigitalAvatarType())){ + String imgUrl1 = record.getUserImageList().get(0); + String imgUrl2 = record.getUserImageList().get(1); + String imgUrl3 = record.getUserImageList().get(2); + param.setImg_lift(Base64Util.imageUrlToBase64(imgUrl1)); + param.setImg_middle(Base64Util.imageUrlToBase64(imgUrl2)); + param.setImg_right(Base64Util.imageUrlToBase64(imgUrl3)); + }else{ + throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"上传图片参数异常"); + } + + DigitalAvatarResult result = AiDigitalAvatarHelper.digitalAvatarPhoto(param); + if(result.isSuccess()){ + UserDigitalAvatarOrderServiceImpl proxy = (UserDigitalAvatarOrderServiceImpl) AopContext.currentProxy(); + proxy.handlePhoto(record,result.getImgList()); + }else{ + updOrder.setStatus(EnumDigitalAvatarOrderStatus.fail.getCode()); + updOrder.setMsg(result.getMsg()); + } + + }catch(MallinkException e){ + e.printStackTrace(); + updOrder.setStatus(EnumDigitalAvatarOrderStatus.fail.getCode()); + updOrder.setMsg(e.getMessage()); + } catch(Exception e){ + e.printStackTrace(); + updOrder.setStatus(EnumDigitalAvatarOrderStatus.fail.getCode()); + updOrder.setMsg("未知错误,请稍后重试"); + } + updOrder.setUpdateDate(new Date()); + userDigitalAvatarOrderMapper.updateById(updOrder); + + } + + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public void handlePhoto(UserDigitalAvatarOrder record,List imgList){ + Date now = new Date(); + UserDigitalAvatarOrder updOrder = new UserDigitalAvatarOrder(); + updOrder.setId(record.getId()); + updOrder.setStatus(EnumDigitalAvatarOrderStatus.finish.getCode()); + updOrder.setMsg("success"); + updOrder.setUpdateDate(now); + userDigitalAvatarOrderMapper.updateById(updOrder); + + try{ + final IdWorker idWorker = IdWorker.get(); + for (String img: imgList) { + InputStream inputStream = Base64Util.base2InputStream(img); + String img_url = aliyunOSS.upload(record.getTenantId(), ".jpg", inputStream); + + UserDigitalAvatarPhoto userDigitalAvatarPhoto = new UserDigitalAvatarPhoto(); + userDigitalAvatarPhoto.setId(idWorker.nextId()); + userDigitalAvatarPhoto.setOrderId(record.getId()); + userDigitalAvatarPhoto.setUserId(record.getUserId()); + userDigitalAvatarPhoto.setImage(img_url); + userDigitalAvatarPhoto.setStatus(EnumDigitalAvatarPhotoStatus.def.getCode()); + userDigitalAvatarPhoto.setCreateDate(now); + userDigitalAvatarPhoto.setUpdateDate(now); + userDigitalAvatarPhotoMapper.insert(userDigitalAvatarPhoto); + } + + }catch(Exception e){ + throw new MallinkException(ErrorCode.PICTURE_ANALYZING_ERROR.getCode(),"上传图片异常"); + } + } + +} diff --git a/suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarPhotoServiceImpl.java b/suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarPhotoServiceImpl.java new file mode 100644 index 0000000..5792d62 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarPhotoServiceImpl.java @@ -0,0 +1,131 @@ +package com.iformall.service.sm.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.ResultData; +import com.iformall.domain.po.sm.*; +import com.iformall.enums.*; +import com.iformall.exception.MallinkException; +import com.iformall.file.aliyun.AliyunOSS; +import com.iformall.mapper.UserDigitalAvatarPhotoMapper; +import com.iformall.service.UserBasicPropertyService; +import com.iformall.service.sm.*; +import com.iformall.sm.*; +import com.iformall.utils.Base64Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.io.InputStream; +import java.util.*; +import java.util.concurrent.Future; + + +@Service +public class UserDigitalAvatarPhotoServiceImpl implements UserDigitalAvatarPhotoService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + UserDigitalAvatarPhotoMapper userDigitalAvatarPhotoMapper; + + @Autowired + UserBasicPropertyService userBasicPropertyService; + + @Autowired + private AliyunOSS aliyunOSS; + + + @Override + public UserDigitalAvatarPhoto selectById(Long id) { + return userDigitalAvatarPhotoMapper.selectById(id); + } + + @Override + public ResultData createPhotoSupper(UserDigitalAvatarPhoto record) { + if(!EnumDigitalAvatarPhotoStatus.def.getCode().equals(record.getStatus())){ + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"照片状态异常"); + } + + try{ + UserDigitalAvatarPhotoServiceImpl proxy = (UserDigitalAvatarPhotoServiceImpl) AopContext.currentProxy(); + proxy.handleCreateSupper(record); + + proxy.superPhoto(record); + return new ResultData(record); + }catch(MallinkException e){ + return new ResultData(e.getErrorCode(),e.getMessage()); + }catch(Exception e){ + return new ResultData(ErrorCode.SYS_SERVER_ERROR); + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public void handleCreateSupper(UserDigitalAvatarPhoto record){ + Date now = new Date(); + //todo 获取超分价格 + Integer price = 0; + record.setPrice(price); + if(price > 0){ + userBasicPropertyService.consumptionGlod(record.getUserId(),EnumProject.PROJECT_5.getCode(), EnumPropertyLogType.CONSUMPTION_11.getCode(), + price,record.getId(),now); + } + + UserDigitalAvatarPhoto updPhoto = new UserDigitalAvatarPhoto(); + updPhoto.setId(record.getId()); + updPhoto.setPrice(record.getPrice()); + updPhoto.setStatus(EnumDigitalAvatarPhotoStatus.wait.getCode()); + updPhoto.setUpdateDate(now); + userDigitalAvatarPhotoMapper.updateById(updPhoto); + + record.setStatus(EnumDigitalAvatarPhotoStatus.wait.getCode()); + record.setUpdateDate(now); + } + + + @Override + public void superPhoto(UserDigitalAvatarPhoto record){ + if(EnumDigitalAvatarPhotoStatus.finish.getCode().equals(record.getStatus())){ + return; + } + UserDigitalAvatarPhoto updPhoto = new UserDigitalAvatarPhoto(); + updPhoto.setId(record.getId()); + try{ + SuperImgParam param = new SuperImgParam(); + param.setImg(Base64Util.imageUrlToBase64(record.getImage())); + SuperImgResult result = AiDigitalAvatarHelper.superImg(param); + if(result.isSuccess()){ + InputStream inputStream = Base64Util.base2InputStream(result.getImg()); + String img_url = aliyunOSS.upload(record.getTenantId(), ".jpg", inputStream); + + updPhoto.setImageSuper(img_url); + updPhoto.setStatus(EnumDigitalAvatarPhotoStatus.finish.getCode()); + updPhoto.setMsg("success"); + }else{ + updPhoto.setStatus(EnumDigitalAvatarOrderStatus.fail.getCode()); + updPhoto.setMsg(result.getMsg()); + } + + } catch(MallinkException e){ + e.printStackTrace(); + updPhoto.setStatus(EnumDigitalAvatarPhotoStatus.fail.getCode()); + updPhoto.setMsg(e.getMessage()); + } catch(Exception e){ + e.printStackTrace(); + updPhoto.setStatus(EnumDigitalAvatarPhotoStatus.fail.getCode()); + updPhoto.setMsg("未知错误,请稍后重试"); + } + updPhoto.setUpdateDate(new Date()); + userDigitalAvatarPhotoMapper.updateById(updPhoto); + } + +} diff --git a/suimangService/src/main/java/com/iformall/sm/AiDigitalAvatarHelper.java b/suimangService/src/main/java/com/iformall/sm/AiDigitalAvatarHelper.java new file mode 100644 index 0000000..317bff6 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/sm/AiDigitalAvatarHelper.java @@ -0,0 +1,107 @@ +package com.iformall.sm; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.iformall.utils.HttpUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Component +public class AiDigitalAvatarHelper { + + private static String digital_avatar; + @Value("${photo.digital_avatar}") + public void setDigitalAvatar(String digital_avatar){ + this.digital_avatar = digital_avatar; + } + + + public static DigitalAvatarResult digitalAvatarPhoto(DigitalAvatarParam param) { + +// log.info("生成照片start request:" + param.getBg_img()); + String response = HttpUtil.doAiVideoPost(digital_avatar + "/make_face", JSONObject.toJSONString(param)); + log.info("生成照片end response:"+response); + + DigitalAvatarResult result = new DigitalAvatarResult(); + + if(StringUtils.isBlank(response)){ + result.setSuccess(false); + result.setMsg("[metavatar]请求异常,请稍后重试"); + return result; + } + + JSONObject jsonObject = JSON.parseObject(response); + JSONObject status = jsonObject.getJSONObject("status"); + Integer code = status.getInteger("code"); + if(code == null){ + result.setSuccess(false); + result.setMsg("[metavatar]请求异常,请稍后重试"); + return result; + } + + if(code.intValue() == 1000){ + result.setSuccess(true); + result.setMsg("success"); + JSONObject data = jsonObject.getJSONObject("data"); + List imgList = new ArrayList<>(); + imgList.add(data.getString("img_0")); + imgList.add(data.getString("img_1")); + imgList.add(data.getString("img_2")); + imgList.add(data.getString("img_3")); + result.setImgList(imgList); + }else{ + result.setSuccess(false); + result.setMsg("[metavatar]"+status.getString("msg")); + } + return result; + + } + + public static SuperImgResult superImg(SuperImgParam param) { + +// log.info("生成照片start request:" + param.getBg_img()); + String response = HttpUtil.doAiVideoPost(digital_avatar + "/sr_img", JSONObject.toJSONString(param)); + log.info("照片超分end response:"+response); + + SuperImgResult result = new SuperImgResult(); + + if(StringUtils.isBlank(response)){ + result.setSuccess(false); + result.setMsg("[metavatar]请求异常,请稍后重试"); + return result; + } + + JSONObject jsonObject = JSON.parseObject(response); + JSONObject status = jsonObject.getJSONObject("status"); + Integer code = status.getInteger("code"); + if(code == null){ + result.setSuccess(false); + result.setMsg("[metavatar]请求异常,请稍后重试"); + return result; + } + + if(code.intValue() == 1000){ + result.setSuccess(true); + result.setMsg("success"); + JSONObject data = jsonObject.getJSONObject("data"); + result.setImg(data.getString("img")); + }else{ + result.setSuccess(false); + result.setMsg("[metavatar]"+status.getString("msg")); + } + return result; + + } + + public static void main(String[] args) { + + } + + +} diff --git a/suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java b/suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java index be84281..81a8aa7 100644 --- a/suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java +++ b/suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java @@ -36,16 +36,20 @@ public class AiVideoHelper { public void setUrl(String url){ this.url = url; } + private static String hy_url; @Value("${photo.hy_url}") public void setHyUrl(String hyUrl){ this.hy_url = hyUrl; } + private static String talk_url; @Value("${photo.talk}") public void setTalkUrl(String talkUrl){ this.talk_url = talkUrl; } + + public static String photo_speak_suffix = "/img_talking"; public static String image_quality_suffix = "/image_qualit"; public static String voice_preview = "/tts_wav"; diff --git a/suimangService/src/main/java/com/iformall/sm/DigitalAvatarParam.java b/suimangService/src/main/java/com/iformall/sm/DigitalAvatarParam.java new file mode 100644 index 0000000..ddb37c8 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/sm/DigitalAvatarParam.java @@ -0,0 +1,18 @@ +package com.iformall.sm; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class DigitalAvatarParam { + + private String bg_img; + private String img_lift; + private String img_middle; + private String img_right; + +} diff --git a/suimangService/src/main/java/com/iformall/sm/DigitalAvatarResult.java b/suimangService/src/main/java/com/iformall/sm/DigitalAvatarResult.java new file mode 100644 index 0000000..d0755ea --- /dev/null +++ b/suimangService/src/main/java/com/iformall/sm/DigitalAvatarResult.java @@ -0,0 +1,15 @@ +package com.iformall.sm; + +import lombok.Data; + +import java.util.List; + +@Data +public class DigitalAvatarResult { + + private boolean success; + private String msg; + + private List imgList; + +} diff --git a/suimangService/src/main/java/com/iformall/sm/SuperImgParam.java b/suimangService/src/main/java/com/iformall/sm/SuperImgParam.java new file mode 100644 index 0000000..231a95e --- /dev/null +++ b/suimangService/src/main/java/com/iformall/sm/SuperImgParam.java @@ -0,0 +1,10 @@ +package com.iformall.sm; + +import lombok.Data; + +@Data +public class SuperImgParam { + + private String img; + +} diff --git a/suimangService/src/main/java/com/iformall/sm/SuperImgResult.java b/suimangService/src/main/java/com/iformall/sm/SuperImgResult.java new file mode 100644 index 0000000..5db6dcb --- /dev/null +++ b/suimangService/src/main/java/com/iformall/sm/SuperImgResult.java @@ -0,0 +1,13 @@ +package com.iformall.sm; + +import lombok.Data; + +@Data +public class SuperImgResult { + + private boolean success; + private String msg; + + private String img; + +} diff --git a/suimangService/src/main/java/com/iformall/utils/Base64Util.java b/suimangService/src/main/java/com/iformall/utils/Base64Util.java index a41780f..633b2df 100644 --- a/suimangService/src/main/java/com/iformall/utils/Base64Util.java +++ b/suimangService/src/main/java/com/iformall/utils/Base64Util.java @@ -1,10 +1,12 @@ package com.iformall.utils; +import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; +import java.util.Base64; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -366,6 +368,41 @@ public class Base64Util { return null; } + + public static InputStream base2InputStream(String base64string) { + ByteArrayInputStream stream = null; + try { + BASE64Decoder decoder = new BASE64Decoder(); + byte[] bt = decoder.decodeBuffer(base64string); + stream = new ByteArrayInputStream(bt); + } catch (Exception e) { + e.printStackTrace(); + } + return stream; + + } + + public static String getFormatName(byte[] bytes) { + if (bytes == null || bytes.length < 2) { + return null; + } + if ((bytes[0] & 0xFF) == 0x47 && (bytes[1] & 0xFF) == 0x49) { + return "gif"; + } + if ((bytes[0] & 0xFF) == 0x89 && (bytes[1] & 0xFF) == 0x50) { + return "png"; + } + if ((bytes[0] & 0xFF) == 0xFF && (bytes[1] & 0xFF) == 0xD8) { + return "jpg"; + } + return null; + } + + public static String getFormatNameFromBase64(String base64) { + byte[] bytes = Base64.getDecoder().decode(base64); + return getFormatName(bytes); + } + // /** // * 图片转字符串 // * @param image 图片Buffer diff --git a/suimangService/src/main/resources/mapper/DigitalAvatarMouldMapper.xml b/suimangService/src/main/resources/mapper/DigitalAvatarMouldMapper.xml index 01e93da..ce9e4da 100644 --- a/suimangService/src/main/resources/mapper/DigitalAvatarMouldMapper.xml +++ b/suimangService/src/main/resources/mapper/DigitalAvatarMouldMapper.xml @@ -15,7 +15,9 @@ + + @@ -25,7 +27,7 @@ `id`, `tenant_id`, `parent_tenant_id`, `cover_img`, `cover_picture`, `detail_picture`, `title`, `sub_title`, `scene_sign`, `sale_price`, `price`, - `detail`, `remark`, `mould_sm_id`, + `detail`, `remark`, `mould_type`, `mould_sm_id`, `again_count`, `status`, `puton_date`, `create_date`, `update_date` @@ -47,20 +49,12 @@ and `title` like concat('%', #{title},'%') - - and `sub_title` like concat('%', #{subTitle},'%') - - and JSON_CONTAINS(scene_sign,json_array(#{sceneSign})) - - and `sale_price` = #{salePrice} - - - - and `price` = #{price} + + and `mould_type` = #{mouldType} @@ -99,7 +93,7 @@ select `id`, `cover_img`, `cover_picture`, `title`, `sub_title`, `scene_sign`, `sale_price`, `price`, - `mould_sm_id`, + `mould_type`, `mould_sm_id`, `status`, `create_date`, `update_date` from digital_avatar_mould diff --git a/suimangService/src/main/resources/mapper/UserBasicPropertyMapper.xml b/suimangService/src/main/resources/mapper/UserBasicPropertyMapper.xml index e44d4a7..0e03c9d 100644 --- a/suimangService/src/main/resources/mapper/UserBasicPropertyMapper.xml +++ b/suimangService/src/main/resources/mapper/UserBasicPropertyMapper.xml @@ -44,9 +44,17 @@ update user_basic_property set `update_date` = #{updateDate} - ,`digital_avatar_glod` = digital_avatar_glod+#{digitalAvatarGlod} - ,`digital_avatar_residue_glod` = digital_avatar_residue_glod+#{digitalAvatarResidueGlod} + ,`digital_avatar_glod` = digital_avatar_glod+#{addGlod} + ,`digital_avatar_residue_glod` = digital_avatar_residue_glod+#{addGlod} where id = #{id} + + update user_basic_property + set `update_date` = #{updateDate} + ,`digital_avatar_residue_glod` = digital_avatar_residue_glod-#{reduceGlod} + where id = #{id} + and digital_avatar_residue_glod >= #{reduceGlod} + + diff --git a/suimangService/src/main/resources/mapper/UserDigitalAvatarOrderMapper.xml b/suimangService/src/main/resources/mapper/UserDigitalAvatarOrderMapper.xml new file mode 100644 index 0000000..7202729 --- /dev/null +++ b/suimangService/src/main/resources/mapper/UserDigitalAvatarOrderMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + `id`, `tenant_id`, `parent_tenant_id`, `order_id`, `user_id`, + `user_images`, `digital_avatar_id`, `digital_avatar_type`, `digital_avatar_sm`, `price`, + `title`, `remark`, `status`, `msg`, `create_date`, `update_date` + + + + where `is_del` = 0 + + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + and `order_id` = #{orderId} + + + + and `user_id` = #{userId} + + + + and `digital_avatar_id` = #{digitalAvatarId} + + + + and `digital_avatar_type` = #{digitalAvatarType} + + + + and `title` like concat('%', #{title},'%') + + + + and `status` = #{status} + + + + and create_date >= #{startDate} + + + and create_date < #{endDate} + + + + and id in + + #{idItem} + + + + order by ${sortColumns} + + + + + + update user_digital_avatar_order set is_del = 1,update_date = now() where id = #{id} + + + + + + diff --git a/suimangService/src/main/resources/mapper/UserDigitalAvatarPhotoMapper.xml b/suimangService/src/main/resources/mapper/UserDigitalAvatarPhotoMapper.xml new file mode 100644 index 0000000..80823d1 --- /dev/null +++ b/suimangService/src/main/resources/mapper/UserDigitalAvatarPhotoMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + `id`, `tenant_id`, `parent_tenant_id`, `order_id`, `user_id`, + `image`, `price`, + `remark`,`image_super`, `status`, `msg`, `create_date`, `update_date` + + + + where `is_del` = 0 + + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + and `order_id` = #{orderId} + + + + and `user_id` = #{userId} + + + + and `status` = #{status} + + + + and create_date >= #{startDate} + + + and create_date < #{endDate} + + + + and id in + + #{idItem} + + + + order by ${sortColumns} + + + + + + update user_digital_avatar_photo set is_del = 1,update_date = now() where id = #{id} + + + + +