新购绑定

This commit is contained in:
mashuai 2024-10-22 15:38:00 +08:00
parent 83cc6bd022
commit ef3e01353c
11 changed files with 1224 additions and 11 deletions

View File

@ -176,6 +176,23 @@
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
<!-- Apache Commons Compress library for ZIP handling -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.22</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,63 @@
package com.bonus.common.biz.config;
/**
* 二维码类路径
* @Author ma_sh
* @create 2024/10/22 15:18
*/
public class BackstageApplication {
private final static String CS_LOGIN_PATH = "ahjj.jypxks.com:9988";
// private final static String CS_LOGIN_PATH = "112.30.107.201:9988";
//测试环境
//private final static String CS_LOGIN_PATH = "192.168.0.14:2011";
private final static String CS_USER_NAME = "root";
private final static String CS_PASSWORD = "bonusadmin";
private final static String CS_EP_ID = "system";
private final static String url = "http://ahjj.jypxks.com:9988/imw/";
// private final static String url = "http://192.168.0.6:18082/imt_cs/";
//private final static String url = "http://192.168.0.14:2011/imw_cs/";
private final static String imageUrlPrefix = "http://ahjj.jypxks.com:9988/imw/images/";
//测试环境
//private final static String imageUrlPrefix = "http://192.168.0.14:2011/imt_cs/images/";
private final static String fileUrlPrefix = "http://ahjj.jypxks.com:9988/imw/maTypeFile/";
//测试环境
// private final static String fileUrlPrefix = "http://192.168.0.14:2011/imt_cs/maTypeFile/";
public static String getCsLoginPath() {
return CS_LOGIN_PATH;
}
public static String getCsUserName() {
return CS_USER_NAME;
}
public static String getCsPassword() {
return CS_PASSWORD;
}
public static String getCsEpId() {
return CS_EP_ID;
}
public static String getUrl() {
return url;
}
public static String getImageUrlPrefix(){
return imageUrlPrefix;
}
public static String getFileurlprefix() {
return fileUrlPrefix;
}
}

View File

@ -0,0 +1,603 @@
package com.bonus.common.biz.config;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* @Author ma_sh
* @create 2024/10/22 14:36
*/
public class DateTimeHelper {
private static final SimpleDateFormat FULL_SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 获取当前时间的年份
*
* @return
*/
public static String getNowYear() {
return format(new Date(), "yyyy");
}
public static String getNowMonthAndDay() {
return format(new Date(), "MM-dd");
}
public static String getYear(Date d) {
int year = d.getYear() + 1900;
return year + "";
}
/**
* 格式化 时间
*
* @param format
* @return
*/
public static String format(Date d, String format) {
SimpleDateFormat df = new SimpleDateFormat(format);
return df.format(d);
}
public static String format(String str, String format, String disFormat) {
Date d = parse(str, format);
return format(d, disFormat);
}
/**
* 格式化 时间
*
* @param format
* @return
*/
public static String format(Date d, DateFormat format) {
return format.format(d);
}
/**
* 格式化 时间
*
* @param format
* @return Date
* @throws ParseException
*/
public static Date parse(String dateStr, String format) {
SimpleDateFormat df = new SimpleDateFormat(format);
try {
return df.parse(dateStr);
} catch (ParseException e) {
return new Date();
}
}
public static Date parse(String dateStr, String format, Date d) {
try {
SimpleDateFormat df = new SimpleDateFormat(format);
return df.parse(dateStr);
} catch (Exception e) {
return d;
}
}
/**
* 解析时间
*
* @return Date
* @throws ParseException
*/
public static Date parse(String dateStr, DateFormat format) throws ParseException {
return format.parse(dateStr);
}
public static Date parseDate(String dateStr) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(dateStr);
}
/**
* 获取当前时间的年月
*
* @return
*/
public static String getPrevMonth() {
return minusMonth(new Date(), 1);
}
/**
* 获取当前时间的上个年月
*
* @return
*/
public static String getNowMonth() {
return format(new Date(), "yyyy-MM");
}
/**
* 获取当前时间的上个年月格式化
*
* @return
*/
public static String getNowMonthFomart() {
return format(new Date(), "yyyyMM");
}
/**
* 获取当前时间的前一天
*
* @return
*/
public static String getPreDate(String dateStr) {
Date date = parse(dateStr, "yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DAY_OF_MONTH, -1);
return format(c.getTime(), "yyyy-MM-dd");
}
/**
* 获取当前时间的上一个月
*
* @return
*/
public static String getPreMonthDate() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date); // 设置为当前时间
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1); // 设置为上一个月
date = calendar.getTime();
return format(date, "yyyy-MM-dd");
}
public static String getPreMonth() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1); // 设置为上一个月
date = calendar.getTime();
return format(date, "yyyy-MM");
}
/**
* 获取当前时间的前两个月
*
* @return
*/
public static String getTwoMonthDate() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date); // 设置为当前时间
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 2); // 设置为前两个月
date = calendar.getTime();
return format(date, "yyyy-MM-dd");
}
/**
* 获取当前时间的上一年
*
* @return
*/
public static String getPreYearDate() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date); // 设置为当前时间
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - 1); // 设置为上一年
date = calendar.getTime();
return format(date, "yyyy-MM-dd");
}
/**
* 获取当前时间的年月日
*
* @return
*/
public static String getNowDate() {
return format(new Date(), "yyyy-MM-dd");
}
public static String getNowDateFomart() {
return format(new Date(), "yyyyMMdd");
}
/**
* 明年的昨天
*
* @param dateStr
* @return
*/
public static String getNextYearDate(String dateStr) {
Date date = parse(dateStr, "yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.YEAR, 1);
c.add(Calendar.DAY_OF_MONTH, -1);
return format(c.getTime(), "yyyy-MM-dd");
}
/**
* 获取前年
*
* @param dateStr
* @return
*/
public static String getBeforeYearDate(String dateStr) {
Date date = parse(dateStr, "yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.YEAR, -1);
// c.add(Calendar.DAY_OF_MONTH, 1);
return format(c.getTime(), "yyyy-MM-dd");
}
/**
* 获取明天时间的年月日
*
* @return
*/
public static String getTomorrowDate(String nowDate) {
Date date = parse(nowDate, "yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, 1);
return format(c.getTime(), "yyyy-MM-dd");
}
/**
* 获取当前时间
*
* @return
*/
public static String getNowTime() {
return format(new Date(), "yyyy-MM-dd HH:mm:ss");
}
public static String getNowTimeFomart() {
return format(new Date(), "yyyyMMddHHmmss");
}
public static String getNextYear() {
return format(new Date(), "yyyy-MM-dd HH:mm:ss");
}
/**
*
* @return
*/
public static String minusMonth(Date date, int c) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM");
try {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, -c);
return format(cal.getTime(), df);
} catch (Exception e) {
return format(date, df);
}
}
/**
*
* @param month
* @return
*/
public static String minusMonth(String month, int c) {
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM");
Date date = parse(month, df);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, -c);
return format(cal.getTime(), df);
} catch (Exception e) {
return month;
}
}
/**
*
* @return
*/
public static Date minus(Date d, int type, int c) {
try {
Calendar cal = Calendar.getInstance();
cal.setTime(d);
cal.add(type, -c);
return cal.getTime();
} catch (Exception e) {
return new Date();
}
}
/**
* 得到前一个月
*
* @param month
* @return
*/
public static String prevMonth(String month) {
return minusMonth(month, 1);
}
/**
* 得到前一个月
*
* @param month
* @return
*/
public static String prevMonth(String month, int c) {
return minusMonth(month, c);
}
public static float duration(String startTime, String stopTime) {
Date sd = DateTimeHelper.parse(startTime, "yyyy-MM-dd HH:mm");
long sl = sd.getTime();
Date ed = DateTimeHelper.parse(stopTime, "yyyy-MM-dd HH:mm");
long el = ed.getTime();
float l = el - sl;
if (l <= 0) {
l = 0;
}
l = l / (1000 * 60);
return l;
}
public static String getStartYearMonthBySeason(String year, int season) {
switch (season) {
case 1:
return getYearMonth(year, "01");
case 2:
return getYearMonth(year, "04");
case 3:
return getYearMonth(year, "07");
case 4:
return getYearMonth(year, "10");
default:
return getYearMonth(year, "01");
}
}
private static String getYearMonth(String year, String month) {
return year + "-" + month;
}
public static String getEndYearMonthBySeason(String year, int season) {
switch (season) {
case 1:
return getYearMonth(year, "03");
case 2:
return getYearMonth(year, "06");
case 3:
return getYearMonth(year, "09");
case 4:
return getYearMonth(year, "12");
default:
return getYearMonth(year, "03");
}
}
public static String getAddNumDay(String giveTime, int addDay) {
String time = giveTime;
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
try {
date = sdf.parse(time);
} catch (ParseException e) {
e.printStackTrace();
}
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, +addDay);// +1今天的时间加一天
date = calendar.getTime();
time = sdf.format(date);
return time;
}
/**
* date2比date1多的天数
*
* @param date1
* @param date2
* @return
*/
public static int differentDays(Date date1, Date date2) {
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
int day1 = cal1.get(Calendar.DAY_OF_YEAR);
int day2 = cal2.get(Calendar.DAY_OF_YEAR);
int year1 = cal1.get(Calendar.YEAR);
int year2 = cal2.get(Calendar.YEAR);
if (year1 != year2) // 同一年
{
int timeDistance = 0;
for (int i = year1; i < year2; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) // 闰年
{
timeDistance += 366;
} else // 不是闰年
{
timeDistance += 365;
}
}
return timeDistance + (day2 - day1);
} else // 不同年
{
// System.out.println("判断day2 - day1 : " + (day2 - day1));
return day2 - day1;
}
}
/**
* 通过时间秒毫秒数判断两个时间的间隔
*
* @param date1
* @param date2
* @return
*/
public static int differentDaysByMillisecond(Date date1, Date date2) {
int days = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
return days;
}
public static int calcDate(String dateStr, String dateStr2) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = format.parse(dateStr);
Date date2 = format.parse(dateStr2);
return DateTimeHelper.differentDays(date, date2);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
// 判断时间date1是否在时间date2之前
// 时间格式 2005-4-21
public static boolean isDateBefore(String date1, String date2) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date bt = sdf.parse(date1);
Date et = sdf.parse(date2);
if (bt.before(et)) {
return true;
} else {
return false;
}
} catch (ParseException e) {
System.out.print("[SYS] " + e.getMessage());
return false;
}
}
public static boolean isFirstDay() {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
return c.get(Calendar.DAY_OF_MONTH) == 1;
}
public static String getFirstDay() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 获取当前月第一天
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, 0);
c.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
String first = format.format(c.getTime());
return first;
}
public static String getLastDay() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 获取当前月最后一天
Calendar ca = Calendar.getInstance();
ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
String last = format.format(ca.getTime());
return last;
}
public static String getPreFirstDay() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 获取当前月第一天
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, -1);
c.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
String first = format.format(c.getTime());
return first;
}
public static String getPreLastDay() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 获取当前月最后一天
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, -1);
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
String last = format.format(c.getTime());
return last;
}
// 计算两个日期相差年数
public static int yearDateDiff(String startDate, String endDate) {
int year = 0;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar bef = Calendar.getInstance();
Calendar aft = Calendar.getInstance();
bef.setTime(sdf.parse(startDate));
aft.setTime(sdf.parse(endDate));
year = aft.get(Calendar.YEAR) - bef.get(Calendar.YEAR);
} catch (ParseException e) {
e.printStackTrace();
}
return year;
}
public static boolean isInXMinutes(String createTime, int x) {
try {
Date date = FULL_SDF.parse(createTime);
Date now = new Date();
long diff = now.getTime() - date.getTime();
return diff <= x * 60 * 1000;
} catch (ParseException e) {
e.printStackTrace();
return false;
}
}
public static boolean isMonthStartAndEnd(String startDateStr, String endDateStr) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = sdf.parse(startDateStr);
Date endDate = sdf.parse(endDateStr);
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDate);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);
Calendar today = Calendar.getInstance();
today.setTime(new Date());
if (startCal.get(Calendar.DAY_OF_MONTH) == 1
&& endCal.get(Calendar.DAY_OF_MONTH) == endCal.getActualMaximum(Calendar.DAY_OF_MONTH)
&& startCal.get(Calendar.YEAR) == endCal.get(Calendar.YEAR)
&& startCal.get(Calendar.MONTH) == endCal.get(Calendar.MONTH) && startCal.before(today)
&& endCal.before(today)) {
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 判断当前时间是否为当月的最后一天
*
* @return
*/
public static boolean isLastDayOfMonth() {
String day = getLastDay();
String currentDay = getNowDate();
if (day.equals(currentDay)) {
return true;
} else {
return false;
}
}
}

View File

@ -0,0 +1,180 @@
package com.bonus.common.biz.config;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Hashtable;
/**
* @Author ma_sh
* @create 2024/10/22 14:40
*/
public class QrCodeUtils {
/** 二维码宽度 */
private static int width = 280;
/** 二维码高度 */
private static int height = 280;
/** 前景色 */
private static int onColor = 0xFF000000;
/** 背景色 */
private static int offColor = 0xFFFFFFFF;
/** 白边大小取值范围0~4 */
private static int margin = 0;
/** 二维码容错率 */
private static ErrorCorrectionLevel level = ErrorCorrectionLevel.L;
/**
* 生成带logo的二维码图片
*
* @param txt //二维码内容
* @param logoPath //logo绝对物理路径
* @param imgPath //二维码保存绝对物理路径
* @param imgName //二维码文件名称
* @param suffix //图片后缀名
* @throws Exception
*/
public static void generateQRImage(String txt, String logoPath, String imgPath, String imgName, String suffix)
throws Exception {
File filePath = new File(imgPath);
if (!filePath.exists()) {
filePath.mkdirs();
}
if (imgPath.endsWith("/")) {
imgPath += imgName;
} else {
imgPath += "/" + imgName;
}
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.ERROR_CORRECTION, level);
// 设置白边
hints.put(EncodeHintType.MARGIN, margin);
BitMatrix bitMatrix = new MultiFormatWriter().encode(txt, BarcodeFormat.QR_CODE, width, height, hints);
File qrcodeFile = new File(imgPath);
writeToFile(bitMatrix, suffix, qrcodeFile, logoPath);
}
/**
* 生成二维码
*
* @param txt //二维码内容
* @param imgPath //二维码保存物理路径
* @param imgName //二维码文件名称
* @param suffix //图片后缀名
*/
public static void generateQRImage(String txt, String imgPath, String imgName, String suffix) {
File filePath = new File(imgPath);
if (!filePath.exists()) {
filePath.mkdirs();
}
File imageFile = new File(imgPath, imgName);
Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
// 指定纠错等级
hints.put(EncodeHintType.ERROR_CORRECTION, level);
// 指定编码格式
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 设置白边
hints.put(EncodeHintType.MARGIN, margin);
try {
MatrixToImageConfig config = new MatrixToImageConfig(onColor, offColor);
BitMatrix bitMatrix = new MultiFormatWriter().encode(txt, BarcodeFormat.QR_CODE, width, height, hints);
// bitMatrix = deleteWhite(bitMatrix);
MatrixToImageWriter.writeToPath(bitMatrix, suffix, imageFile.toPath(), config);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param matrix 二维码矩阵相关
* @param format 二维码图片格式
* @param file 二维码图片文件
* @param logoPath logo路径
* @throws IOException
*/
public static void writeToFile(BitMatrix matrix, String format, File file, String logoPath) throws IOException {
BufferedImage image = toBufferedImage(matrix);
Graphics2D gs = image.createGraphics();
int ratioWidth = image.getWidth() * 2 / 10;
int ratioHeight = image.getHeight() * 2 / 10;
// 载入logo
Image img = ImageIO.read(new File(logoPath));
int logoWidth = img.getWidth(null) > ratioWidth ? ratioWidth : img.getWidth(null);
int logoHeight = img.getHeight(null) > ratioHeight ? ratioHeight : img.getHeight(null);
int x = (image.getWidth() - logoWidth) / 2;
int y = (image.getHeight() - logoHeight) / 2;
gs.drawImage(img, x, y, logoWidth, logoHeight, null);
gs.setColor(Color.black);
gs.setBackground(Color.WHITE);
gs.dispose();
img.flush();
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
/**
* 压缩目录中的图片到ZIP文件
*
* @param sourceDir 源目录
* @param zipFilePath ZIP文件路径
* @throws IOException 如果压缩过程失败
*/
public static void zipImages(Path sourceDir, Path zipFilePath) throws IOException {
try (FileOutputStream fos = new FileOutputStream(zipFilePath.toFile());
ZipArchiveOutputStream zos = new ZipArchiveOutputStream(fos)) {
Files.walk(sourceDir)
.filter(Files::isRegularFile)
.forEach(file -> {
try {
ZipArchiveEntry zipEntry = new ZipArchiveEntry(file.toFile(), sourceDir.relativize(file).toString());
zos.putArchiveEntry(zipEntry);
Files.copy(file, zos);
zos.closeArchiveEntry();
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? onColor : offColor);
}
}
return image;
}
}

View File

@ -13,6 +13,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@ -76,4 +77,15 @@ public class PurchaseBindController extends BaseController {
public AjaxResult getInfo(PurchaseDto dto) {
return purchaseBindService.selectPurchaseCheckInfoById(dto);
}
/**
* 二维码生成下载一体操作
* @param response
* @param purchaseDto
*/
@PostMapping(value = "/downloadQrCode")
@RequiresPermissions("purchase:bpmPurchaseInfo:query")
public void downloadQrCode(HttpServletResponse response, PurchaseDto purchaseDto) {
purchaseBindService.downloadQrCode(response, purchaseDto);
}
}

View File

@ -1,9 +1,12 @@
package com.bonus.material.purchase.dto;
import com.bonus.common.core.web.domain.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
@ -11,7 +14,8 @@ import java.util.List;
* @create 2024/10/21 13:58
*/
@Data
public class PurchaseDto extends BaseEntity {
@Builder
public class PurchaseDto {
@ApiModelProperty(value = "id")
private String taskId;
@ -63,4 +67,12 @@ public class PurchaseDto extends BaseEntity {
@ApiModelProperty(value = "提交绑定数据集合")
private List<PurchaseDto> dtoList;
private String createBy;
private Date createTime;
private String updateBy;
private Date updateTime;
}

View File

@ -2,6 +2,7 @@ package com.bonus.material.purchase.mapper;
import com.bonus.material.purchase.dto.PurchaseDto;
import com.bonus.material.purchase.vo.PurchaseVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -45,4 +46,31 @@ public interface PurchaseBindMapper {
* @return
*/
int add(PurchaseDto purchaseDto);
/**
* 查询二维码code
* @param genMonth
* @return
*/
List<PurchaseVo> select(String genMonth);
/**
* 查询状态
* @param purchaseDto
* @return
*/
Integer selectStatus(PurchaseDto purchaseDto);
/**
* 更新状态
* @param id
* @param purchaseId
*/
void updateStatus(@Param("id") String id, @Param("purchaseId") String purchaseId);
/**
* 二维码数据保存
* @param dto
*/
void insert(PurchaseDto dto);
}

View File

@ -4,6 +4,7 @@ import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.material.purchase.dto.PurchaseDto;
import com.bonus.material.purchase.vo.PurchaseVo;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@ -39,4 +40,11 @@ public interface IPurchaseBindService {
* @return
*/
AjaxResult bind(PurchaseDto dto);
/**
* 下载二维码
* @param response
* @param purchaseDto
*/
void downloadQrCode(HttpServletResponse response, PurchaseDto purchaseDto);
}

View File

@ -1,7 +1,11 @@
package com.bonus.material.purchase.service.impl;
import com.bonus.common.biz.config.BackstageApplication;
import com.bonus.common.biz.config.DateTimeHelper;
import com.bonus.common.biz.config.QrCodeUtils;
import com.bonus.common.biz.constant.MaterialConstants;
import com.bonus.common.biz.enums.HttpCodeEnum;
import com.bonus.common.core.constant.SecurityConstants;
import com.bonus.common.core.utils.DateUtils;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.security.utils.SecurityUtils;
@ -9,23 +13,36 @@ import com.bonus.material.purchase.dto.PurchaseDto;
import com.bonus.material.purchase.mapper.PurchaseBindMapper;
import com.bonus.material.purchase.service.IPurchaseBindService;
import com.bonus.material.purchase.vo.PurchaseVo;
import com.bonus.system.api.RemoteUserService;
import com.bonus.system.api.domain.SysUser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.zxing.WriterException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @Author ma_sh
* @create 2024/10/21 18:42
*/
@Service
@Slf4j
public class PurchaseBindServiceImpl implements IPurchaseBindService {
@Resource
private PurchaseBindMapper purchaseBindMapper;
@Resource
private RemoteUserService remoteUserService;
/**
* 查询所有绑定信息
* @param dto
@ -53,10 +70,35 @@ public class PurchaseBindServiceImpl implements IPurchaseBindService {
iterator.remove();
}
}
extracted(list);
}
return list;
}
/**
* 远程调用方法抽取
* @param list
*/
private void extracted(List<PurchaseVo> list) {
for (PurchaseVo purchaseVo : list) {
try {
AjaxResult ajaxResult = remoteUserService.getInfo(Long.parseLong(purchaseVo.getCreateBy()), SecurityConstants.INNER);
if (ajaxResult.isSuccess()) {
// ajaxResult.get("data") 返回的是 LinkedHashMap
LinkedHashMap<String, Object> rawDataList = (LinkedHashMap<String, Object>) ajaxResult.get("data");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
if (rawDataList != null) {
SysUser sysUser = objectMapper.convertValue(rawDataList, SysUser.class);
purchaseVo.setCreateBy(sysUser.getNickName() == null ? "" : sysUser.getNickName());
}
}
} catch (IllegalArgumentException e) {
log.error("远程调用查询失败:", e.getMessage());
}
}
}
/**
* 查询绑定信息
* @param dto
@ -110,4 +152,176 @@ public class PurchaseBindServiceImpl implements IPurchaseBindService {
}
return AjaxResult.error(HttpCodeEnum.FAIL.getCode(), HttpCodeEnum.FAIL.getMsg());
}
/**
* 下载二维码
* @param response
* @param purchaseDto
*/
@Override
public void downloadQrCode(HttpServletResponse response, PurchaseDto purchaseDto) {
//生成二维码
Set<String> addedEntries = new HashSet<>();
if (purchaseDto.getPurchaseId() == null) {
throw new RuntimeException("内层id为空");
}
String genMonth = DateTimeHelper.getNowMonth();
List<PurchaseVo> codeList = purchaseBindMapper.select(genMonth);
try (OutputStream os = response.getOutputStream();
ZipOutputStream zos = new ZipOutputStream(os)) {
Integer status = purchaseBindMapper.selectStatus(purchaseDto);
if (status == null) {
return;
}
//内层二维码下载
handlePurchaseId(addedEntries, purchaseDto, codeList, status, zos, genMonth);
zos.flush();
} catch (WriterException | IOException e) {
e.printStackTrace();
}
}
/**
* 内层二维码下载
* @param purchaseDto
* @param codeList
* @param status
* @param zos
* @param genMonth
* @throws IOException
* @throws WriterException
*/
private void handlePurchaseId(Set<String> addedEntries, PurchaseDto purchaseDto, List<PurchaseVo> codeList, Integer status, ZipOutputStream zos, String genMonth) throws IOException, WriterException {
if (status == 1) {
Select(addedEntries, purchaseDto, zos);
} else {
int num = getInitialNum(codeList);
List<PurchaseVo> details = purchaseBindMapper.getDetails(purchaseDto);
if (CollectionUtils.isNotEmpty(details)) {
PurchaseVo detail = details.get(0);
purchaseDto.setTaskId(detail.getTaskId().toString());
getString(addedEntries, purchaseDto, genMonth, num, zos, detail.getMaterialModel(), detail.getMaterialName(), detail.getTypeId(), detail.getCheckNum());
extractedUpStatus(purchaseDto);
}
}
}
/**
* 方法抽取
* @param purchaseDto
* @param genMonth
* @param num
* @param zos
* @param materialModel
* @param materialName
* @param typeId
* @param checkNum
* @throws WriterException
* @throws IOException
*/
private void getString(Set<String> addedEntries, PurchaseDto purchaseDto, String genMonth, int num, ZipOutputStream zos, String materialModel, String materialName, Integer typeId, Integer checkNum) throws WriterException, IOException {
for (int j = 1; j <= checkNum; j++) {
genMonth = genMonth.replace("-", "");
String code = genMonth + "-" + String.format("%5d", num + j).replace(" ", "0");
// 新购管理-二维码打印-新增
String url = BackstageApplication.getUrl() + "backstage/machine/qrCodePage?qrcode=" + code;
// // 二维码的图片格式
String format = "jpg";
//设置路径
String mkdirsName = "images";
// linux 系统路径
String saveDirectory = "/data/imw/" + mkdirsName + "/";
String os = System.getProperty("os.name");
if (os.toLowerCase().startsWith("win")) {
//本地路径
saveDirectory = "D://files/" + mkdirsName + "/";
}
// 生成二维码
File files = new File(saveDirectory);
if (!files.exists()) {
files.mkdirs();
}
QrCodeUtils.generateQRImage(url, saveDirectory, code + ".jpg", format);
String qrUrl = saveDirectory + code + ".jpg";
PurchaseDto dto = PurchaseDto.builder().taskId(purchaseDto.getTaskId()).typeId(typeId).qrCode(code).qrUrl(qrUrl).createBy(SecurityUtils.getUserId().toString()).build();
purchaseBindMapper.insert(dto);
extracted( addedEntries, zos, materialModel, materialName, code, qrUrl);
}
}
/**
* 修改任务表方法抽取
* @param purchaseDto
*/
private void extractedUpStatus(PurchaseDto purchaseDto) {
//修改任务表的是否下载状态
purchaseBindMapper.updateStatus(purchaseDto.getTaskId(), purchaseDto.getPurchaseId());
}
/**
* 获取初始化num
* @param codeList
* @return
*/
private int getInitialNum(List<PurchaseVo> codeList) {
if (com.alibaba.nacos.common.utils.CollectionUtils.isNotEmpty(codeList)) {
PurchaseVo purchaseVo = codeList.get(0);
return Integer.parseInt(purchaseVo.getQrCode().split("-")[1]);
}
return 0;
}
/**
* 查询方法抽取
* @param purchaseDto
* @param zos
* @throws IOException
*/
private void Select(Set<String> addedEntries, PurchaseDto purchaseDto, ZipOutputStream zos) throws IOException {
List<PurchaseVo> list = purchaseBindMapper.selectPurchaseCheckInfoById(purchaseDto);
if (com.alibaba.nacos.common.utils.CollectionUtils.isNotEmpty(list)) {
for (PurchaseVo purchaseVo : list) {
String materialModel = purchaseVo.getMaterialModel();
String materialName = purchaseVo.getMaterialName();
String path = purchaseVo.getQrUrl();
String qrCode = purchaseVo.getQrCode();
path = path.replace("filePath", "/data/imw");
extracted(addedEntries, zos, materialModel, materialName, qrCode, path);
}
}
}
/**
* 二维码下载方法抽取
* @param zos
* @param materialModel
* @param materialName
* @param code
* @param path
* @throws IOException
*/
private void extracted(Set<String> addedEntries, ZipOutputStream zos, String materialModel, String materialName, String code, String path) throws IOException {
// 判断路径是否存在
File imageFile = new File(path);
if (!imageFile.exists()) {
return;
}
String entryName = "[" + materialModel + "-" + materialName + "]" + code + ".jpg";
if (addedEntries.contains(entryName)) {
System.out.println("Duplicate entry skipped: " + entryName);
return;
}
addedEntries.add(entryName);
zos.setLevel(0);
zos.putNextEntry(new ZipEntry(entryName));
try (InputStream fis = new FileInputStream(imageFile)) {
byte[] buffer = new byte[1024];
int r;
while ((r = fis.read(buffer)) != -1) {
zos.write(buffer, 0, r);
}
}
zos.closeEntry();
}
}

View File

@ -102,6 +102,9 @@ public class PurchaseVo {
@ApiModelProperty(value = "出厂编号")
private String outFacCode;
@ApiModelProperty(value = "二维码")
@ApiModelProperty(value = "二维码code")
private String qrCode;
@ApiModelProperty(value = "二维码路径")
private String qrUrl;
}

View File

@ -44,6 +44,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim>
</insert>
<insert id="insert">
INSERT INTO purchase_macode_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="qrCode != null">
qr_code,
</if>
<if test="typeId != null">
type_id,
</if>
<if test="qrUrl != null">
qr_url,
</if>
<if test="id != null">
task_id,
</if>
<if test="createBy != null">
create_by,
</if>
create_time,
del_flag
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="qrCode != null">
#{qrCode},
</if>
<if test="typeId != null">
#{typeId},
</if>
<if test="qrUrl != null">
#{qrUrl},
</if>
<if test="id != null">
#{id},
</if>
<if test="createBy != null">
#{createBy},
</if>
NOW(),
0
</trim>
</insert>
<update id="updateNum">
UPDATE purchase_check_details
SET input_num = #{purchaseNum}
@ -65,6 +107,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
type_id = #{typeId}
</update>
<update id="updateStatus">
UPDATE purchase_check_details
SET is_download = '1'
WHERE del_flag = '0'
<if test="id != null and id != ''">
and task_id = #{id}
</if>
<if test="purchaseId != null and purchaseId != ''">
and id = #{purchaseId}
</if>
</update>
<select id="selectAll" resultType="com.bonus.material.purchase.vo.PurchaseVo">
SELECT
pci.task_id as taskId,
@ -105,6 +159,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectPurchaseCheckInfoById" resultType="com.bonus.material.purchase.vo.PurchaseVo">
SELECT
pm.task_id AS taskId,
pcd.id AS purchaseId,
mt1.type_name AS materialName,
mt.type_name AS materialModel,
pm.ma_code AS maCode,
@ -113,7 +168,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
pm.type_id AS typeId,
pm.out_fac_code AS outFacCode,
pcd.production_time AS productDate,
pm.qr_code AS qrCode
pm.qr_code AS qrCode,
pm.qr_url AS qrUrl
FROM
purchase_macode_info pm
LEFT JOIN purchase_check_details pcd ON pm.task_id = pcd.task_id
@ -121,12 +177,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LEFT JOIN ma_type mt1 ON mt.parent_id = mt1.type_id
WHERE
1=1
<if test="taskId != null and taskId != ''">
<if test="taskId != null ">
AND pm.task_id = #{taskId}
</if>
<if test="typeId != null and typeId != ''">
<if test="typeId != null '">
AND pm.type_id = #{typeId}
</if>
<if test="purchaseId != null '">
AND pcd.id = #{purchaseId}
</if>
</select>
<select id="getDetails" resultType="com.bonus.material.purchase.vo.PurchaseVo">
@ -173,11 +232,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="select" resultType="com.bonus.material.purchase.vo.PurchaseVo">
SELECT
pcd.task_id as taskId,
pcd.status as STATUS
qr_code as qrCode
FROM
purchase_check_details pcd
where pcd.task_id = #{taskId}
purchase_macode_info
WHERE
DATE_FORMAT(create_time, '%Y-%m') = #{genMonth}
ORDER BY
qr_code DESC
</select>
<select id="selectByCode" resultType="com.bonus.material.purchase.dto.PurchaseDto">
@ -190,4 +251,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where del_flag = '0' and ma_code = #{maCode}
</select>
<select id="selectStatus" resultType="java.lang.Integer">
SELECT
is_download
FROM
purchase_check_details
WHERE
del_flag = '0'
<if test="purchaseId != null and purchaseId != ''">
and id = #{purchaseId}
</if>
</select>
</mapper>