Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
H
haoban-manage3.0
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
haoban3.0
haoban-manage3.0
Commits
ebf637b6
Commit
ebf637b6
authored
Apr 26, 2023
by
songyinghui
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 分享对象转换
parent
9301f3e1
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
343 additions
and
10 deletions
+343
-10
MaterialConvertDTO.java
...gic/haoban/manage/api/dto/content/MaterialConvertDTO.java
+76
-0
MaterialShareLogApiService.java
...anage/api/service/content/MaterialShareLogApiService.java
+11
-0
MaterialShareLogApiServiceImpl.java
...vice/out/impl/content/MaterialShareLogApiServiceImpl.java
+79
-0
DrawImageUtils.java
...va/com/gic/haoban/manage/service/util/DrawImageUtils.java
+129
-9
ContentMaterialController.java
...age/web/controller/content/ContentMaterialController.java
+17
-1
MaterialConvertVO.java
...m/gic/haoban/manage/web/vo/content/MaterialConvertVO.java
+31
-0
No files found.
haoban-manage3-api/src/main/java/com/gic/haoban/manage/api/dto/content/MaterialConvertDTO.java
0 → 100644
View file @
ebf637b6
package
com
.
gic
.
haoban
.
manage
.
api
.
dto
.
content
;
import
java.io.Serializable
;
import
java.util.List
;
/**
* @Author MUSI
* @Date 2023/4/26 1:57 PM
* @Description
* @Version
**/
public
class
MaterialConvertDTO
implements
Serializable
{
private
String
enterpriseId
;
private
String
wxEnterpriseId
;
private
String
qrCodeUrl
;
private
List
<
String
>
imageUrls
;
// 素材类型, 1文本, 2图片, 3网页, 4视频, 5文件,6小程序
private
int
materialType
;
// 1群发 2朋友圈
private
int
mediaType
;
public
String
getEnterpriseId
()
{
return
enterpriseId
;
}
public
void
setEnterpriseId
(
String
enterpriseId
)
{
this
.
enterpriseId
=
enterpriseId
;
}
public
String
getQrCodeUrl
()
{
return
qrCodeUrl
;
}
public
void
setQrCodeUrl
(
String
qrCodeUrl
)
{
this
.
qrCodeUrl
=
qrCodeUrl
;
}
public
List
<
String
>
getImageUrls
()
{
return
imageUrls
;
}
public
void
setImageUrls
(
List
<
String
>
imageUrls
)
{
this
.
imageUrls
=
imageUrls
;
}
public
String
getWxEnterpriseId
()
{
return
wxEnterpriseId
;
}
public
void
setWxEnterpriseId
(
String
wxEnterpriseId
)
{
this
.
wxEnterpriseId
=
wxEnterpriseId
;
}
public
int
getMaterialType
()
{
return
materialType
;
}
public
void
setMaterialType
(
int
materialType
)
{
this
.
materialType
=
materialType
;
}
public
int
getMediaType
()
{
return
mediaType
;
}
public
void
setMediaType
(
int
mediaType
)
{
this
.
mediaType
=
mediaType
;
}
}
haoban-manage3-api/src/main/java/com/gic/haoban/manage/api/service/content/MaterialShareLogApiService.java
View file @
ebf637b6
package
com
.
gic
.
haoban
.
manage
.
api
.
service
.
content
;
import
com.gic.api.base.commons.ServiceResponse
;
import
com.gic.haoban.manage.api.dto.content.MaterialConvertDTO
;
import
com.gic.haoban.manage.api.dto.content.log.ClerkShareMaterialLogDTO
;
import
java.util.List
;
/**
* @Author MUSI
* @Date 2023/3/18 8:20 PM
...
...
@@ -19,4 +22,12 @@ public interface MaterialShareLogApiService {
* @return
*/
ServiceResponse
<
Long
>
saveClerkShareMaterialLog
(
ClerkShareMaterialLogDTO
clerkShareMaterialLogDTO
);
/**
* 转换素材id
* @param materialConvertDTO
* @return
*/
ServiceResponse
<
List
<
String
>>
convertMaterialId
(
MaterialConvertDTO
materialConvertDTO
);
}
haoban-manage3-service/src/main/java/com/gic/haoban/manage/service/service/out/impl/content/MaterialShareLogApiServiceImpl.java
View file @
ebf637b6
...
...
@@ -4,14 +4,20 @@ import com.alibaba.fastjson.JSON;
import
com.gic.api.base.commons.ServiceResponse
;
import
com.gic.commons.util.GICMQClientUtil
;
import
com.gic.commons.util.UniqueIdUtils
;
import
com.gic.enterprise.api.dto.EnterpriseDTO
;
import
com.gic.enterprise.api.service.EnterpriseService
;
import
com.gic.haoban.manage.api.dto.ContentMaterialDTO
;
import
com.gic.haoban.manage.api.dto.content.MaterialConvertDTO
;
import
com.gic.haoban.manage.api.dto.content.log.ClerkShareMaterialLogDTO
;
import
com.gic.haoban.manage.api.dto.content.log.TriggerCustomerDetailLogDTO
;
import
com.gic.haoban.manage.api.enums.content.ClerkShareMaterialType
;
import
com.gic.haoban.manage.api.service.MaterialApiService
;
import
com.gic.haoban.manage.api.service.content.MaterialShareLogApiService
;
import
com.gic.haoban.manage.service.pojo.bo.content.ClerkShareLogBO
;
import
com.gic.haoban.manage.service.pojo.bo.content.TriggerCustomerDetailBO
;
import
com.gic.haoban.manage.service.service.content.ClerkShareLogService
;
import
com.gic.haoban.manage.service.service.content.TriggerCustomerDetailService
;
import
com.gic.haoban.manage.service.util.DrawImageUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
...
...
@@ -19,8 +25,15 @@ import org.springframework.beans.BeanUtils;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayOutputStream
;
import
java.io.InputStream
;
import
java.net.URL
;
import
java.util.Collections
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.stream.Collectors
;
/**
* @Author MUSI
...
...
@@ -42,6 +55,10 @@ public class MaterialShareLogApiServiceImpl implements MaterialShareLogApiServic
private
ClerkShareLogService
clerkShareLogService
;
@Autowired
TriggerCustomerDetailService
triggerCustomerDetailService
;
@Autowired
EnterpriseService
enterpriseService
;
@Autowired
MaterialApiService
materialApiService
;
@Override
...
...
@@ -90,4 +107,66 @@ public class MaterialShareLogApiServiceImpl implements MaterialShareLogApiServic
}
return
ServiceResponse
.
success
(
logId
);
}
/**
* 转换素材id
*
* @param materialConvertDTO
* @return
*/
@Override
public
ServiceResponse
<
List
<
String
>>
convertMaterialId
(
MaterialConvertDTO
materialConvertDTO
)
{
EnterpriseDTO
enterpriseDTO
=
enterpriseService
.
getEnterpriseById
(
materialConvertDTO
.
getEnterpriseId
());
if
(
enterpriseDTO
==
null
)
{
return
ServiceResponse
.
failure
(
"-701"
,
"企业不存在"
);
}
ByteArrayOutputStream
byteArrayOutputStream
=
null
;
try
{
URL
url
=
new
URL
(
materialConvertDTO
.
getQrCodeUrl
());
InputStream
inputStream
=
url
.
openStream
();
byteArrayOutputStream
=
cloneInputStream
(
inputStream
);
}
catch
(
Exception
ex
)
{
log
.
info
(
"获取二维码流对象异常 qrCodeUrl:{}"
,
materialConvertDTO
.
getQrCodeUrl
());
return
ServiceResponse
.
failure
(
"-701"
,
"系统异常"
);
}
if
(
byteArrayOutputStream
==
null
)
{
return
ServiceResponse
.
success
();
}
ByteArrayOutputStream
finalByteArrayOutputStream
=
byteArrayOutputStream
;
List
<
String
>
imageUrls
=
materialConvertDTO
.
getImageUrls
()
.
parallelStream
()
.
map
(
item
->
DrawImageUtils
.
addWater
(
enterpriseDTO
.
getFactoryCode
(),
item
,
new
ByteArrayInputStream
(
finalByteArrayOutputStream
.
toByteArray
())))
.
collect
(
Collectors
.
toList
());
List
<
String
>
materialIds
=
imageUrls
.
parallelStream
()
.
map
(
item
->
{
ContentMaterialDTO
contentMaterialDTO
=
new
ContentMaterialDTO
();
contentMaterialDTO
.
setMaterialType
(
materialConvertDTO
.
getMaterialType
());
contentMaterialDTO
.
setImgUrl
(
item
);
contentMaterialDTO
.
setMediaType
(
materialConvertDTO
.
getMediaType
());
ServiceResponse
<
String
>
serviceResponse
=
materialApiService
.
getMaterialId
(
materialConvertDTO
.
getWxEnterpriseId
(),
contentMaterialDTO
);
if
(
serviceResponse
.
isSuccess
())
{
return
serviceResponse
.
getResult
();
}
return
null
;
})
.
filter
(
Objects:
:
nonNull
)
.
collect
(
Collectors
.
toList
());
return
ServiceResponse
.
success
(
materialIds
);
}
private
static
ByteArrayOutputStream
cloneInputStream
(
InputStream
input
)
{
try
{
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
byte
[]
buffer
=
new
byte
[
1024
];
int
len
;
while
((
len
=
input
.
read
(
buffer
))
>
-
1
)
{
baos
.
write
(
buffer
,
0
,
len
);
}
baos
.
flush
();
return
baos
;
}
catch
(
Exception
e
)
{
return
null
;
}
}
}
haoban-manage3-service/src/main/java/com/gic/haoban/manage/service/util/DrawImageUtils.java
View file @
ebf637b6
...
...
@@ -5,15 +5,27 @@ import com.gic.thirdparty.cloudfile.CloudFileUtil;
import
com.gic.thirdparty.cloudfile.enums.CloudFileBusinessOptEnum
;
import
com.gic.thirdparty.cloudfile.enums.CloudFileTypeEnum
;
import
com.gic.thirdparty.cloudfile.pojo.CloudFileInfo
;
import
com.sun.image.codec.jpeg.JPEGCodec
;
import
com.sun.image.codec.jpeg.JPEGImageEncoder
;
import
com.tencentcloudapi.tcm.v20210413.models.IstioConfig
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.util.ResourceUtils
;
import
org.springframework.util.StopWatch
;
import
javax.imageio.ImageIO
;
import
java.awt.*
;
import
java.awt.geom.Ellipse2D
;
import
java.awt.image.BufferedImage
;
import
java.io.ByteArrayOutputStream
;
import
java.io.File
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.math.BigDecimal
;
import
java.math.RoundingMode
;
import
java.net.URL
;
import
java.util.Random
;
/**
...
...
@@ -99,15 +111,123 @@ public class DrawImageUtils {
return
null
;
}
public
static
void
main
(
String
[]
args
)
{
static
InputStream
inputStream
=
null
;
static
{
try
{
URL
url
=
new
URL
(
"https://gicinner-1251519181.cos.ap-shanghai.myqcloud.com/image/material_content-80819999f96f448d9fcccb5ac86e6c37.png"
);
inputStream
=
url
.
openStream
();
}
catch
(
Exception
ex
)
{
}
}
/***
* 二维码合成
* 1、先获取图片的宽高
* 2、如果图片高度大于2000,则按最大高度2000,宽度等比处理
* 3、图片与二维码按照750:136比例显示
*
* 位置距离右边20px,底部20px
*/
public
static
String
addWater
(
String
factoryCode
,
String
url
,
InputStream
qrCodeStream
)
{
// 读取原图片信息
//文件转化为图片
try
{
StopWatch
stopWatch
=
new
StopWatch
();
stopWatch
.
start
(
"下载图片"
);
long
startTime
=
System
.
currentTimeMillis
();
Image
srcImg
=
ImageIO
.
read
(
new
URL
(
url
));
stopWatch
.
stop
();
//获取图片的宽
int
srcImgWidth
=
srcImg
.
getWidth
(
null
);
//获取图片的高
int
srcImgHeight
=
srcImg
.
getHeight
(
null
);
log
.
info
(
"图片宽度:{}, 图片高度:{}"
,
srcImgHeight
,
srcImgHeight
);
BufferedImage
bufImg
=
null
;
if
(
srcImgHeight
>
2000
)
{
log
.
info
(
"原图片高度超过2000 高度:{}, 等比压缩"
,
srcImgHeight
);
// 按高度等比压缩
int
tempWidth
=
BigDecimal
.
valueOf
(
srcImgWidth
)
.
multiply
(
BigDecimal
.
valueOf
(
2000
).
divide
(
BigDecimal
.
valueOf
(
srcImgHeight
),
2
,
RoundingMode
.
HALF_DOWN
))
.
intValue
();
log
.
info
(
"压缩后的宽:{}"
,
tempWidth
);
srcImgHeight
=
2000
;
srcImgWidth
=
tempWidth
;
}
bufImg
=
resize
(
srcImg
,
srcImgHeight
,
srcImgWidth
,
false
);
Graphics2D
g
=
bufImg
.
createGraphics
();
//使用工具类生成二维码
stopWatch
.
start
(
"处理二维码"
);
Image
image
=
ImageIO
.
read
(
qrCodeStream
);
//将小图片绘到大图片上,500,300 .表示你的小图片在大图片上的位置。
int
qrCodeHeight
=
image
.
getHeight
(
null
);
int
qrCodeWidth
=
image
.
getWidth
(
null
);
log
.
info
(
"二维码图片宽度:{},高度:{}"
,
qrCodeWidth
,
qrCodeHeight
);
int
qrCodeWidthTemp
=
srcImgWidth
*
136
/
750
;
log
.
info
(
"二维码计算后的宽度 {}"
,
qrCodeWidthTemp
);
BufferedImage
qrCodeImage
=
resize
(
image
,
qrCodeWidthTemp
,
qrCodeWidthTemp
,
true
);
stopWatch
.
stop
();
stopWatch
.
start
(
"合成图片"
);
g
.
drawImage
(
qrCodeImage
,
srcImgWidth
-
(
qrCodeWidthTemp
+
20
),
srcImgHeight
-
(
qrCodeWidthTemp
+
20
),
null
);
ByteArrayOutputStream
bos
=
new
ByteArrayOutputStream
();
ImageIO
.
write
(
bufImg
,
"png"
,
bos
);
g
.
dispose
();
byte
[]
bytes
=
bos
.
toByteArray
();
log
.
info
(
"合成之后的大小 {}"
,
bytes
.
length
);
CloudFileInfo
cloudFileInfo
=
CloudFileUtil
.
uploadFile
(
bytes
,
"png"
,
CloudFileTypeEnum
.
IMAGE
,
factoryCode
,
CloudFileBusinessOptEnum
.
HAOBAN_COMMON
);
log
.
info
(
"上传图片结果:{}"
,
JSON
.
toJSONString
(
cloudFileInfo
));
stopWatch
.
stop
();
log
.
info
(
"处理耗时: {}"
,
stopWatch
.
prettyPrint
());
long
endTime
=
System
.
currentTimeMillis
();
log
.
info
(
"合成图片耗时 {} 秒"
,
(
endTime
-
startTime
)
/
1000
);
if
(
cloudFileInfo
!=
null
)
{
return
cloudFileInfo
.
getOrgFileUrl
();
}
}
catch
(
Exception
ex
)
{
log
.
info
(
"处理图片发生异常"
,
ex
);
}
return
url
;
}
public
static
BufferedImage
resize
(
Image
img
,
int
h
,
int
w
,
boolean
clip
)
throws
IOException
{
//参数是TYPE_3BYTE_BGR时,图片最清晰!
BufferedImage
image
=
new
BufferedImage
(
w
,
h
,
BufferedImage
.
TYPE_4BYTE_ABGR
);
//留一个像素的空白区域,这个很重要,画圆的时候把这个覆盖
Graphics
graphics
=
image
.
getGraphics
();
if
(
clip
)
{
int
border
=
1
;
//图片是一个圆型
Ellipse2D
.
Double
shape
=
new
Ellipse2D
.
Double
(
border
,
border
,
h
-
border
*
2
,
w
-
border
*
2
);
//需要保留的区域
graphics
.
setClip
(
shape
);
}
// 绘制缩小后的图像
graphics
.
drawImage
(
img
,
0
,
0
,
w
,
h
,
null
);
graphics
.
dispose
();
return
image
;
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
try
{
URL
url
=
new
URL
(
"https://gicinner-1251519181.cos.ap-shanghai.myqcloud.com/image/material_content-80819999f96f448d9fcccb5ac86e6c37.png"
);
inputStream
=
url
.
openStream
();
}
catch
(
Exception
ex
)
{
}
//String url = "https://jhdm-1251519181.cos.ap-shanghai.myqcloud.com/image/material_content-7c3bc8061ffb4e2694c0e288a1ce176b.jpeg?imageView2/format/jpg/q/50";
String
url
=
"https://newdmwltest-1251519181.cos.ap-shanghai.myqcloud.com/image/material_content-bd89447576b5438d8045def2da2c4c0f.jpg?imageView2/format/jpg/q/50"
;
System
.
setProperty
(
"gic.module.name"
,
"haoban-manage3-service"
);
Random
random
=
new
Random
();
String
url
=
DrawImageUtils
.
drawImage
(
"jhdm"
,
Math
.
abs
(
random
.
nextInt
(
1000
))
+
""
,
Math
.
abs
(
random
.
nextInt
(
1000
))
+
"万"
,
DrawBkgImg
.
AREA_MONTH_BKG
);
System
.
out
.
println
(
url
);
String
temp
=
DrawImageUtils
.
drawImage
(
"jhdm"
,
Math
.
abs
(
random
.
nextInt
(
1000
))
+
""
,
Math
.
abs
(
random
.
nextInt
(
1000
))
+
"万"
,
DrawBkgImg
.
CLERK_MONTH_BKG
);
System
.
out
.
println
(
temp
);
DrawImageUtils
.
addWater
(
"jhdm"
,
url
,
inputStream
);
// Random random = new Random();
// String url = DrawImageUtils.drawImage("jhdm", Math.abs(random.nextInt(1000)) + "",
// Math.abs(random.nextInt(1000)) + "万", DrawBkgImg.AREA_MONTH_BKG);
// System.out.println(url);
//
// String temp = DrawImageUtils.drawImage("jhdm", Math.abs(random.nextInt(1000)) + "",
// Math.abs(random.nextInt(1000)) + "万", DrawBkgImg.CLERK_MONTH_BKG);
// System.out.println(temp);
}
}
haoban-manage3-wx/src/main/java/com/gic/haoban/manage/web/controller/content/ContentMaterialController.java
View file @
ebf637b6
...
...
@@ -16,7 +16,9 @@ import com.gic.content.api.service.ContentColumnApiService;
import
com.gic.content.api.service.ContentMaterialApiService
;
import
com.gic.content.api.service.ContentMaterialShareApiService
;
import
com.gic.haoban.common.utils.EntityUtil
;
import
com.gic.haoban.manage.api.dto.content.MaterialConvertDTO
;
import
com.gic.haoban.manage.api.service.StaffApiService
;
import
com.gic.haoban.manage.api.service.content.MaterialShareLogApiService
;
import
com.gic.haoban.manage.web.controller.content.adaptor.ClerkStoreAdaptor
;
import
com.gic.haoban.manage.web.controller.goods.GoodsInfoAdaptor
;
import
com.gic.haoban.manage.web.qo.content.ContentColumnClerkViewQO
;
...
...
@@ -25,6 +27,7 @@ import com.gic.haoban.manage.web.qo.content.ContentMaterialShareQO;
import
com.gic.haoban.manage.web.vo.content.ContentColumnInfoVO
;
import
com.gic.haoban.manage.web.vo.content.ContentMaterialInfoVO
;
import
com.gic.haoban.manage.web.vo.content.ContentMaterialShareInfoVO
;
import
com.gic.haoban.manage.web.vo.content.MaterialConvertVO
;
import
com.gic.haoban.manage.web.vo.content.SimpleGoodsInfoVO
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
...
...
@@ -44,7 +47,6 @@ import java.util.stream.Collectors;
/**
* 好办-素材中心(二期)
*
*/
@RestController
public
class
ContentMaterialController
{
...
...
@@ -61,6 +63,8 @@ public class ContentMaterialController {
private
ClerkStoreAdaptor
clerkStoreAdaptor
;
@Autowired
private
GoodsInfoAdaptor
goodsInfoAdaptor
;
@Autowired
MaterialShareLogApiService
materialShareLogApiService
;
/**
...
...
@@ -152,6 +156,7 @@ public class ContentMaterialController {
/**
* 对象转换
*
* @param goodsShowStatus
* @param item
* @return
...
...
@@ -233,4 +238,15 @@ public class ContentMaterialController {
return
RestResponse
.
successResult
();
}
@RequestMapping
(
path
=
"/share-convert"
)
public
RestResponse
<?>
shareConvert
(
@RequestBody
MaterialConvertVO
materialConvertVO
)
{
MaterialConvertDTO
materialConvertDTO
=
new
MaterialConvertDTO
();
BeanUtils
.
copyProperties
(
materialConvertVO
,
materialConvertDTO
);
ServiceResponse
<
List
<
String
>>
serviceResponse
=
materialShareLogApiService
.
convertMaterialId
(
materialConvertDTO
);
if
(!
serviceResponse
.
isSuccess
())
{
return
RestResponse
.
failure
(
serviceResponse
.
getCode
(),
serviceResponse
.
getMessage
());
}
return
RestResponse
.
successResult
(
serviceResponse
.
getResult
());
}
}
haoban-manage3-wx/src/main/java/com/gic/haoban/manage/web/vo/content/MaterialConvertVO.java
0 → 100644
View file @
ebf637b6
package
com
.
gic
.
haoban
.
manage
.
web
.
vo
.
content
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.List
;
/**
* @Author MUSI
* @Date 2023/4/26 2:15 PM
* @Description
* @Version
**/
@Data
public
class
MaterialConvertVO
implements
Serializable
{
private
String
enterpriseId
;
private
String
wxEnterpriseId
;
private
String
qrCodeUrl
;
private
List
<
String
>
imageUrls
;
// 素材类型, 1文本, 2图片, 3网页, 4视频, 5文件,6小程序
private
int
materialType
;
// 1群发 2朋友圈
private
int
mediaType
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment