ソースを参照

//生成照片

private_deployment
xhxu 1年前
コミット
bb39438cf1
32個のファイルの変更1511行の追加19行の削除
  1. +1
    -0
      suimangAdmin/src/main/resources/db/migration/V2023080800001_create.sql
  2. +156
    -0
      suimangCApi/src/main/java/com/iformall/controller/UserDigitalAvatarPhotoController.java
  3. +1
    -0
      suimangCApi/src/main/resources/application-dev.yml
  4. +8
    -0
      suimangService/src/main/java/com/iformall/common/ErrorCode.java
  5. +6
    -0
      suimangService/src/main/java/com/iformall/domain/po/UserBasicProperty.java
  6. +6
    -0
      suimangService/src/main/java/com/iformall/domain/po/sm/DigitalAvatarMould.java
  7. +86
    -0
      suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarOrder.java
  8. +63
    -0
      suimangService/src/main/java/com/iformall/domain/po/sm/UserDigitalAvatarPhoto.java
  9. +49
    -0
      suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarMouldType.java
  10. +38
    -0
      suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarOrderStatus.java
  11. +42
    -0
      suimangService/src/main/java/com/iformall/enums/EnumDigitalAvatarPhotoStatus.java
  12. +5
    -1
      suimangService/src/main/java/com/iformall/enums/EnumPropertyLogType.java
  13. +4
    -1
      suimangService/src/main/java/com/iformall/mapper/UserBasicPropertyMapper.java
  14. +24
    -0
      suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarOrderMapper.java
  15. +22
    -0
      suimangService/src/main/java/com/iformall/mapper/UserDigitalAvatarPhotoMapper.java
  16. +20
    -0
      suimangService/src/main/java/com/iformall/service/UserBasicPropertyService.java
  17. +36
    -3
      suimangService/src/main/java/com/iformall/service/impl/UserBasicPropertyServiceImpl.java
  18. +62
    -0
      suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarOrderService.java
  19. +19
    -0
      suimangService/src/main/java/com/iformall/service/sm/UserDigitalAvatarPhotoService.java
  20. +311
    -0
      suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarOrderServiceImpl.java
  21. +131
    -0
      suimangService/src/main/java/com/iformall/service/sm/impl/UserDigitalAvatarPhotoServiceImpl.java
  22. +107
    -0
      suimangService/src/main/java/com/iformall/sm/AiDigitalAvatarHelper.java
  23. +4
    -0
      suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java
  24. +18
    -0
      suimangService/src/main/java/com/iformall/sm/DigitalAvatarParam.java
  25. +15
    -0
      suimangService/src/main/java/com/iformall/sm/DigitalAvatarResult.java
  26. +10
    -0
      suimangService/src/main/java/com/iformall/sm/SuperImgParam.java
  27. +13
    -0
      suimangService/src/main/java/com/iformall/sm/SuperImgResult.java
  28. +37
    -0
      suimangService/src/main/java/com/iformall/utils/Base64Util.java
  29. +6
    -12
      suimangService/src/main/resources/mapper/DigitalAvatarMouldMapper.xml
  30. +10
    -2
      suimangService/src/main/resources/mapper/UserBasicPropertyMapper.xml
  31. +111
    -0
      suimangService/src/main/resources/mapper/UserDigitalAvatarOrderMapper.xml
  32. +90
    -0
      suimangService/src/main/resources/mapper/UserDigitalAvatarPhotoMapper.xml

+ 1
- 0
suimangAdmin/src/main/resources/db/migration/V2023080800001_create.sql ファイルの表示

@@ -41,6 +41,7 @@ CREATE TABLE `user_basic_property_log` (




user_basic_image user_basic_image
user_digital_avatar_photo


product product
product_order product_order


+ 156
- 0
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<UserDigitalAvatarOrder> 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);
}
}

+ 1
- 0
suimangCApi/src/main/resources/application-dev.yml ファイルの表示

@@ -192,4 +192,5 @@ photo:
url: http://111.198.0.15:22299 url: http://111.198.0.15:22299
hy_url: http://111.198.0.15:22288 hy_url: http://111.198.0.15:22288
talk: http://nas.pucao.cn:2001 talk: http://nas.pucao.cn:2001
digital_avatar: http://nas.pucao.cn:2003
callbackUrl: https://phototest.metavatar.cc/C callbackUrl: https://phototest.metavatar.cc/C

+ 8
- 0
suimangService/src/main/java/com/iformall/common/ErrorCode.java ファイルの表示

@@ -449,6 +449,9 @@ public enum ErrorCode{
MEM_MONTH_IS_USED(13105, "该用户本月已领取或未到领取条件"), MEM_MONTH_IS_USED(13105, "该用户本月已领取或未到领取条件"),




GLOD_NOT_ENOUGH(13200, "金币不足"),


/** /**
* 标签 * 标签
*/ */
@@ -669,6 +672,11 @@ public enum ErrorCode{
TTCOUPON_IS_EMPTY(63000, "课程不存在"), TTCOUPON_IS_EMPTY(63000, "课程不存在"),
TTCOUPON_IS_TAKE_OFF(63001, "课程不在上架状态"), TTCOUPON_IS_TAKE_OFF(63001, "课程不在上架状态"),


/**
* mould
*/
ORDER_CREAT_OVERRUN(64000, "重复生成次数超限"),

; ;


private int code; private int code;


+ 6
- 0
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") @io.swagger.annotations.ApiModelProperty(value="",name="updateDate")
private Date updateDate; private Date updateDate;


@TableField(exist = false)
private Integer addGlod;

@TableField(exist = false)
private Integer reduceGlod;

} }

+ 6
- 0
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") @io.swagger.annotations.ApiModelProperty(value="购买须知",name="remark")
private String remark; private String remark;


@io.swagger.annotations.ApiModelProperty(value="EnumDigitalAvatarMouldType",name="mouldType")
private Integer mouldType;

@io.swagger.annotations.ApiModelProperty(value="模板第三方Id",name="mouldSmId") @io.swagger.annotations.ApiModelProperty(value="模板第三方Id",name="mouldSmId")
private String mouldSmId; private String mouldSmId;


@io.swagger.annotations.ApiModelProperty(value="重试次数",name="againCount")
private Integer againCount;

@io.swagger.annotations.ApiModelProperty(value="EnumaMouldPatchStatus 状态",name="status") @io.swagger.annotations.ApiModelProperty(value="EnumaMouldPatchStatus 状态",name="status")
private Integer status; private Integer status;
@io.swagger.annotations.ApiModelProperty(value="上架时间",name="putonDate") @io.swagger.annotations.ApiModelProperty(value="上架时间",name="putonDate")


+ 86
- 0
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<String> userImageList;

public List<String> getUserImageList(){
if(StringUtils.isNotBlank(userImages)){
try{
return JSONObject.parseArray(userImages, String.class);
}catch(Exception e){
}
}
return new ArrayList<String>();
}


@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<UserDigitalAvatarPhoto> photoList;
}

+ 63
- 0
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;
}

+ 49
- 0
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<Integer> getAllCodes(){
List<Integer> 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;
}

}

+ 38
- 0
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;
}

}

+ 42
- 0
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;
}

}

+ 5
- 1
suimangService/src/main/java/com/iformall/enums/EnumPropertyLogType.java ファイルの表示

@@ -8,7 +8,11 @@ public enum EnumPropertyLogType {
REGISTER(1,"注册"), REGISTER(1,"注册"),
INVITE(2,"邀请"), INVITE(2,"邀请"),
RECHARGE(3, "充值"), RECHARGE(3, "充值"),
CONSUMPTION(4, "消费"),

// CONSUMPTION(4, "消费"),
//智象
CONSUMPTION_10(10, "生成照片"),
CONSUMPTION_11(11, "照片超分"),
; ;


public static EnumPropertyLogType getEnum(Integer code) { public static EnumPropertyLogType getEnum(Integer code) {


+ 4
- 1
suimangService/src/main/java/com/iformall/mapper/UserBasicPropertyMapper.java ファイルの表示

@@ -9,5 +9,8 @@ public interface UserBasicPropertyMapper extends CommonMapper<UserBasicProperty,
List<UserBasicProperty> findList(UserBasicProperty record); List<UserBasicProperty> findList(UserBasicProperty record);


int addGlod(UserBasicProperty userBasicProperty);
int addGlod(UserBasicProperty record);

int reduceGlod(UserBasicProperty record);

} }

+ 24
- 0
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<UserDigitalAvatarOrder, Long> {

List<UserDigitalAvatarOrder> findList(UserDigitalAvatarOrder record);
int deleteById(@Param("id")Long id);

/**
* c端列表查询,尽量减少字段
* @param record
* @return
*/
List<UserDigitalAvatarOrder> findCList(UserDigitalAvatarOrder record);

int findCount(@Param("orderId")Long orderId);

}

+ 22
- 0
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<UserDigitalAvatarPhoto, Long> {

List<UserDigitalAvatarPhoto> findList(UserDigitalAvatarPhoto record);
int deleteById(@Param("id")Long id);

/**
* c端列表查询,尽量减少字段
* @param record
* @return
*/
List<UserDigitalAvatarPhoto> findCList(UserDigitalAvatarPhoto record);

}

+ 20
- 0
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.ProductOrder;
import com.iformall.domain.po.UserBasicProperty; import com.iformall.domain.po.UserBasicProperty;


import java.util.Date;

public interface UserBasicPropertyService { public interface UserBasicPropertyService {


/** /**
@@ -16,6 +18,24 @@ public interface UserBasicPropertyService {
*/ */
PageInfo<UserBasicProperty> listAsPage(UserBasicProperty record, Integer pageIndex, Integer pageSize); PageInfo<UserBasicProperty> 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); 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);

} }

+ 36
- 3
suimangService/src/main/java/com/iformall/service/impl/UserBasicPropertyServiceImpl.java ファイルの表示

@@ -69,8 +69,7 @@ public class UserBasicPropertyServiceImpl implements UserBasicPropertyService {
}else{ }else{
befourGold = userBasicProperty.getDigitalAvatarResidueGlod(); befourGold = userBasicProperty.getDigitalAvatarResidueGlod();


userBasicProperty.setDigitalAvatarGlod(glod);
userBasicProperty.setDigitalAvatarResidueGlod(glod);
userBasicProperty.setAddGlod(glod);
userBasicProperty.setUpdateDate(now); userBasicProperty.setUpdateDate(now);
userBasicPropertyMapper.addGlod(userBasicProperty); userBasicPropertyMapper.addGlod(userBasicProperty);
} }
@@ -86,10 +85,44 @@ public class UserBasicPropertyServiceImpl implements UserBasicPropertyService {
userBasicPropertyLog.setExtraId(extraId); userBasicPropertyLog.setExtraId(extraId);
userBasicPropertyLog.setCreateDate(now); userBasicPropertyLog.setCreateDate(now);
userBasicPropertyLogMapper.insert(userBasicPropertyLog); 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);

}



} }

+ 62
- 0
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<UserDigitalAvatarOrder> listAsPage(UserDigitalAvatarOrder record, Integer pageIndex, Integer pageSize);
PageInfo<UserDigitalAvatarOrder> cListAsPage(UserDigitalAvatarOrder record, Integer pageIndex, Integer pageSize);

List<UserDigitalAvatarOrder> 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);


}

+ 19
- 0
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);

}

+ 311
- 0
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<UserDigitalAvatarOrder> 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<UserDigitalAvatarPhoto> photoList = userDigitalAvatarPhotoMapper.findCList(userDigitalAvatarPhotoQ);
order.setPhotoList(photoList);
}
}
}

@Override
public PageInfo<UserDigitalAvatarOrder> listAsPage(UserDigitalAvatarOrder record, Integer pageIndex, Integer pageSize) {
PageInfo<UserDigitalAvatarOrder> pageInfo = PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> userDigitalAvatarOrderMapper.findList(record));
handleOrderPhoto(pageInfo.getList());
return pageInfo;
}

@Override
public PageInfo<UserDigitalAvatarOrder> cListAsPage(UserDigitalAvatarOrder record, Integer pageIndex, Integer pageSize) {
PageInfo<UserDigitalAvatarOrder> pageInfo = PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> userDigitalAvatarOrderMapper.findCList(record));
handleOrderPhoto(pageInfo.getList());
return pageInfo;
}

@Override
public List<UserDigitalAvatarOrder> 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<UserDigitalAvatarPhoto> 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<String> 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(),"上传图片异常");
}
}

}

+ 131
- 0
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);
}

}

+ 107
- 0
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<String> 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) {

}


}

+ 4
- 0
suimangService/src/main/java/com/iformall/sm/AiVideoHelper.java ファイルの表示

@@ -36,16 +36,20 @@ public class AiVideoHelper {
public void setUrl(String url){ public void setUrl(String url){
this.url = url; this.url = url;
} }

private static String hy_url; private static String hy_url;
@Value("${photo.hy_url}") @Value("${photo.hy_url}")
public void setHyUrl(String hyUrl){ public void setHyUrl(String hyUrl){
this.hy_url = hyUrl; this.hy_url = hyUrl;
} }

private static String talk_url; private static String talk_url;
@Value("${photo.talk}") @Value("${photo.talk}")
public void setTalkUrl(String talkUrl){ public void setTalkUrl(String talkUrl){
this.talk_url = talkUrl; this.talk_url = talkUrl;
} }


public static String photo_speak_suffix = "/img_talking"; public static String photo_speak_suffix = "/img_talking";
public static String image_quality_suffix = "/image_qualit"; public static String image_quality_suffix = "/image_qualit";
public static String voice_preview = "/tts_wav"; public static String voice_preview = "/tts_wav";


+ 18
- 0
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;

}

+ 15
- 0
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<String> imgList;

}

+ 10
- 0
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;

}

+ 13
- 0
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;

}

+ 37
- 0
suimangService/src/main/java/com/iformall/utils/Base64Util.java ファイルの表示

@@ -1,10 +1,12 @@
package com.iformall.utils; package com.iformall.utils;


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; import sun.misc.BASE64Encoder;


import java.io.*; import java.io.*;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.util.Base64;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;


@@ -366,6 +368,41 @@ public class Base64Util {
return null; 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 // * @param image 图片Buffer


+ 6
- 12
suimangService/src/main/resources/mapper/DigitalAvatarMouldMapper.xml ファイルの表示

@@ -15,7 +15,9 @@
<result column="price" jdbcType="INTEGER" property="price"/> <result column="price" jdbcType="INTEGER" property="price"/>
<result column="detail" jdbcType="VARCHAR" property="detail"/> <result column="detail" jdbcType="VARCHAR" property="detail"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/> <result column="remark" jdbcType="VARCHAR" property="remark"/>
<result column="mould_type" jdbcType="INTEGER" property="mouldType"/>
<result column="mould_sm_id" jdbcType="VARCHAR" property="mouldSmId"/> <result column="mould_sm_id" jdbcType="VARCHAR" property="mouldSmId"/>
<result column="again_count" jdbcType="INTEGER" property="againCount"/>
<result column="status" jdbcType="INTEGER" property="status"/> <result column="status" jdbcType="INTEGER" property="status"/>
<result column="puton_date" jdbcType="TIMESTAMP" property="putonDate"/> <result column="puton_date" jdbcType="TIMESTAMP" property="putonDate"/>
<result column="create_date" jdbcType="TIMESTAMP" property="createDate"/> <result column="create_date" jdbcType="TIMESTAMP" property="createDate"/>
@@ -25,7 +27,7 @@
<sql id="allColumns"> <sql id="allColumns">
`id`, `tenant_id`, `parent_tenant_id`, `cover_img`, `cover_picture`, `detail_picture`, `id`, `tenant_id`, `parent_tenant_id`, `cover_img`, `cover_picture`, `detail_picture`,
`title`, `sub_title`, `scene_sign`, `sale_price`, `price`, `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` `status`, `puton_date`, `create_date`, `update_date`
</sql> </sql>


@@ -47,20 +49,12 @@
and `title` like concat('%', #{title},'%') and `title` like concat('%', #{title},'%')
</if> </if>


<if test=" null != subTitle ">
and `sub_title` like concat('%', #{subTitle},'%')
</if>

<if test=" null != sceneSign and '' != sceneSign"> <if test=" null != sceneSign and '' != sceneSign">
and JSON_CONTAINS(scene_sign,json_array(#{sceneSign})) and JSON_CONTAINS(scene_sign,json_array(#{sceneSign}))
</if> </if>


<if test=" null != salePrice ">
and `sale_price` = #{salePrice}
</if>

<if test=" null != price ">
and `price` = #{price}
<if test=" null != mouldType">
and `mould_type` = #{mouldType}
</if> </if>


<if test=" null != status"> <if test=" null != status">
@@ -99,7 +93,7 @@
select select
`id`, `cover_img`, `cover_picture`, `id`, `cover_img`, `cover_picture`,
`title`, `sub_title`, `scene_sign`, `sale_price`, `price`, `title`, `sub_title`, `scene_sign`, `sale_price`, `price`,
`mould_sm_id`,
`mould_type`, `mould_sm_id`,
`status`, `create_date`, `update_date` `status`, `create_date`, `update_date`
from digital_avatar_mould from digital_avatar_mould
<include refid="dynamicWhereConditions"/> <include refid="dynamicWhereConditions"/>


+ 10
- 2
suimangService/src/main/resources/mapper/UserBasicPropertyMapper.xml ファイルの表示

@@ -44,9 +44,17 @@
<update id="addGlod" parameterType="com.iformall.domain.po.UserBasicProperty"> <update id="addGlod" parameterType="com.iformall.domain.po.UserBasicProperty">
update user_basic_property update user_basic_property
set `update_date` = #{updateDate} 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} where id = #{id}
</update> </update>


<update id="reduceGlod" parameterType="com.iformall.domain.po.UserBasicProperty">
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 &gt;= #{reduceGlod}
</update>

</mapper> </mapper>

+ 111
- 0
suimangService/src/main/resources/mapper/UserDigitalAvatarOrderMapper.xml ファイルの表示

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iformall.mapper.UserDigitalAvatarOrderMapper">
<resultMap id="BaseResultMap" type="com.iformall.domain.po.sm.UserDigitalAvatarOrder">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/>
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId" />
<result column="order_id" jdbcType="BIGINT" property="orderId"/>
<result column="user_id" jdbcType="BIGINT" property="userId"/>
<result column="user_images" jdbcType="VARCHAR" property="userImages"/>
<result column="digital_avatar_id" jdbcType="BIGINT" property="digitalAvatarId"/>
<result column="digital_avatar_type" jdbcType="INTEGER" property="digitalAvatarType"/>
<result column="digital_avatar_sm" jdbcType="VARCHAR" property="digitalAvatarSm"/>
<result column="price" jdbcType="INTEGER" property="price"/>

<result column="title" jdbcType="VARCHAR" property="title"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/>
<result column="status" jdbcType="INTEGER" property="status"/>
<result column="msg" jdbcType="VARCHAR" property="msg"/>

<result column="create_date" jdbcType="TIMESTAMP" property="createDate"/>
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/>
</resultMap>

<sql id="allColumns">
`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`
</sql>

<sql id="dynamicWhereConditions">
where `is_del` = 0

<if test=" null != id ">
and `id` = #{id}
</if>

<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>

<if test=" null != orderId ">
and `order_id` = #{orderId}
</if>

<if test=" null != userId ">
and `user_id` = #{userId}
</if>

<if test=" null != digitalAvatarId ">
and `digital_avatar_id` = #{digitalAvatarId}
</if>

<if test=" null != digitalAvatarType ">
and `digital_avatar_type` = #{digitalAvatarType}
</if>

<if test=" null != title and ''!=title">
and `title` like concat('%', #{title},'%')
</if>

<if test=" null != videoStatus ">
and `status` = #{status}
</if>

<if test=" null != startDate ">
and create_date &gt;= #{startDate}
</if>
<if test=" null != endDate">
and create_date &lt; #{endDate}
</if>

<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">
#{idItem}
</foreach>
</if>

<if test=" null != sortColumns">order by ${sortColumns}</if>
</sql>

<select id="findList" parameterType="com.iformall.domain.po.sm.UserDigitalAvatarOrder" resultMap="BaseResultMap">
select
<include refid="allColumns"/>
from user_digital_avatar_order
<include refid="dynamicWhereConditions"/>
</select>

<delete id="deleteById" parameterType="java.util.HashMap">
update user_digital_avatar_order set is_del = 1,update_date = now() where id = #{id}
</delete>

<select id="findCList" parameterType="com.iformall.domain.po.sm.UserDigitalAvatarOrder" resultMap="BaseResultMap">
select
`id`, `order_id`,
`digital_avatar_type`,
`title`, `remark`, `status`, `msg`,`create_date`, `update_date`
from user_digital_avatar_order
<include refid="dynamicWhereConditions"/>
</select>

<select id="findCount" parameterType="java.util.HashMap" resultType="Integer">
select count(1)
from user_digital_avatar_order
where `order_id` = #{orderId}
</select>
</mapper>

+ 90
- 0
suimangService/src/main/resources/mapper/UserDigitalAvatarPhotoMapper.xml ファイルの表示

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iformall.mapper.UserDigitalAvatarPhotoMapper">
<resultMap id="BaseResultMap" type="com.iformall.domain.po.sm.UserDigitalAvatarPhoto">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/>
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId" />
<result column="order_id" jdbcType="BIGINT" property="orderId"/>
<result column="user_id" jdbcType="BIGINT" property="userId"/>
<result column="image" jdbcType="VARCHAR" property="image"/>
<result column="price" jdbcType="INTEGER" property="price"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/>
<result column="image_super" jdbcType="VARCHAR" property="imageSuper"/>
<result column="status" jdbcType="INTEGER" property="status"/>
<result column="msg" jdbcType="VARCHAR" property="msg"/>

<result column="create_date" jdbcType="TIMESTAMP" property="createDate"/>
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/>
</resultMap>

<sql id="allColumns">
`id`, `tenant_id`, `parent_tenant_id`, `order_id`, `user_id`,
`image`, `price`,
`remark`,`image_super`, `status`, `msg`, `create_date`, `update_date`
</sql>

<sql id="dynamicWhereConditions">
where `is_del` = 0

<if test=" null != id ">
and `id` = #{id}
</if>

<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>

<if test=" null != orderId ">
and `order_id` = #{orderId}
</if>

<if test=" null != userId ">
and `user_id` = #{userId}
</if>

<if test=" null != videoStatus ">
and `status` = #{status}
</if>

<if test=" null != startDate ">
and create_date &gt;= #{startDate}
</if>
<if test=" null != endDate">
and create_date &lt; #{endDate}
</if>

<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">
#{idItem}
</foreach>
</if>

<if test=" null != sortColumns">order by ${sortColumns}</if>
</sql>

<select id="findList" parameterType="com.iformall.domain.po.sm.UserDigitalAvatarPhoto" resultMap="BaseResultMap">
select
<include refid="allColumns"/>
from user_digital_avatar_photo
<include refid="dynamicWhereConditions"/>
</select>

<delete id="deleteById" parameterType="java.util.HashMap">
update user_digital_avatar_photo set is_del = 1,update_date = now() where id = #{id}
</delete>

<select id="findCList" parameterType="com.iformall.domain.po.sm.UserDigitalAvatarPhoto" resultMap="BaseResultMap">
select
`id`, `order_id`,
`image`,
`image_super`, `status`, `msg`, `create_date`, `update_date`
from user_digital_avatar_photo
<include refid="dynamicWhereConditions"/>
</select>

</mapper>

読み込み中…
キャンセル
保存