【admin&front】 新增&优化 1、优化客户新增客户编号电话号码唯一 2、优化excel导出图片多线程压缩

dev1.0
renfan 2024-11-04 18:25:42 +08:00
parent 8058ce8a52
commit f8e92b0b48
20 changed files with 535 additions and 39 deletions

View File

@ -142,9 +142,9 @@ public class ClientServiceImpl implements IClientService {
public void add(ClientParam clientParam) {
LambdaQueryWrapper<Client> queryWrapper = new LambdaQueryWrapper<Client>()
.eq(Client::getIsDelete, GlobalConstant.NOT_DELETE)
.eq(Client::getPhone, clientParam.getPhone())
.and(query -> query.eq(Client::getPhone, clientParam.getPhone())
.or()
.eq(Client::getClientNo, clientParam.getClientNo());
.eq(Client::getClientNo, clientParam.getClientNo()));
Integer count = clientMapper.selectCount(queryWrapper);
if(count > 0){

View File

@ -136,6 +136,26 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService {
MaintenanceOrderDto maintenanceOrderDto = new MaintenanceOrderDto();
BeanUtils.copyProperties(maintenanceOrderParam,maintenanceOrderDto);
//当登录的角色是客户角色的时候,工单列表只查这个客户的数据 1-客户-主管人员 2-客户-客服人员 11-客户-采购员
//1、判断当前用户角色是否是客户角色
SystemAuthAdmin systemAuthAdminById = systemAuthAdminMapper.findSystemAuthAdminById(AdminThreadLocal.getAdminId());
//1、1获取当前用户所属的客户
ClientContacts clientContacts = clientContactsMapper.findClientContactsByAdminId(Long.valueOf(systemAuthAdminById.getId()));
//1、2获取当前用户的角色
String role = systemAuthAdminById.getRole();
String[] roleStrings = role.split(","); // 分割字符串
int[] roles = new int[roleStrings.length]; // 创建一个整数数组来存储转换后的数字
for (int i = 0; i < roleStrings.length; i++) {
roles[i] = Integer.parseInt(roleStrings[i]); // 将字符串转换为整数
}
// 输出转换后的整数数组
for (int num : roles) {
if(num == 1 || num == 2 || num == 11){
maintenanceOrderDto.setClientId(clientContacts.getClientId());
}
}
IPage<MaintenanceOrderDto> iPage = maintenanceOrderMapper.list(new Page<>(page, limit), maintenanceOrderDto);
List<MaintenanceOrderListVo> list = new LinkedList<>();
@ -277,6 +297,7 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService {
if(sparePartStockAudit != null){
SparePartStockAuditDetailVo sparePartStockAuditDetailVo = new SparePartStockAuditDetailVo();
BeanUtils.copyProperties(sparePartStockAudit,sparePartStockAuditDetailVo);
vo.setSparePartStockAuditDetailVo(sparePartStockAuditDetailVo);
}
@ -334,7 +355,7 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService {
LambdaQueryWrapper<OrderOperateRecord> queryWrapper = new LambdaQueryWrapper<OrderOperateRecord>()
.eq(OrderOperateRecord::getOrderType, OrderOperateRecordEnum.MAINTENANCE.getStatus())
.eq(OrderOperateRecord::getOrderId, model.getId())
.orderByDesc(OrderOperateRecord::getCreateTime);
.orderByDesc(OrderOperateRecord::getId);
vo.setOrderOperateRecords(orderOperateRecordMapper.selectList(queryWrapper));;
//配件领用状态
@ -440,16 +461,17 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService {
}
}
model.setReceiverId(param.getReceiverId());
model.setReceiverType(param.getReceiverType());
model.setOrderDistance(param.getOrderDistance());
model.setProvinceId(param.getProvinceId());
model.setCityId(param.getCityId());
model.setDistrictId(param.getDistrictId());
model.setFaultId(param.getFaultId());
model.setFaultDescription(param.getFaultDescription());
model.setRemark(param.getRemark());
//修改派单方式
if(param.getReceiverType() != null && param.getId() != null){
//如果原本派单方式跟现在派单方式不一样就进行修改
if(!Objects.equals(model.getReceiverType(), param.getReceiverType())){
//原本派单方式
String oldReceiverType;
if(model.getReceiverType() == 0){
@ -470,21 +492,26 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService {
,OrderOperateRecordEnum.ALTER_RECEIVER_TYPE.getDesc()
,"【"+AdminThreadLocal.get("username")+"】已修改派单方式。原本派单方式为:" +
oldReceiverType + ",已修改派单方式为:" + newReceiverType + "。");
}
}
//修改抢单范围
if(param.getOrderDistance() != null && param.getId() != null){
//新增订单操作记录
orderOperateRecordService.addMaintenanceOrder(model.getId()
,OrderOperateRecordEnum.ALTER_ORDER_DISTANCE.getDesc()
,"【"+AdminThreadLocal.get("username")+"】已修改抢单范围。原本抢单范围为:" +
model.getOrderDistance() + "公里,已修改抢单范围为:" + model.getOrderDistance() + "公里。");
model.getOrderDistance() + "公里,已修改抢单范围为:" + param.getOrderDistance() + "公里。");
}
}else{
throw new OperateException("工单已被接单,无法编辑");
}
model.setReceiverType(param.getReceiverType()); // 接单类型 0-区域派单1-距离派单
model.setOrderDistance(param.getOrderDistance()); // 订单距离
maintenanceOrderMapper.updateById(model);
}

View File

@ -20,6 +20,7 @@ import com.hcy.common.constant.TimeConstant;
import com.hcy.common.core.PageResult;
import com.hcy.common.dto.order.*;
import com.hcy.common.entity.client.Client;
import com.hcy.common.entity.client.ClientContacts;
import com.hcy.common.entity.fault.Fault;
import com.hcy.common.entity.order.*;
import com.hcy.common.entity.setting.DictData;
@ -30,6 +31,7 @@ import com.hcy.common.enums.order.RepairOrderAuditStatusEnum;
import com.hcy.common.enums.order.RepairOrderStatusEnum;
import com.hcy.common.enums.order.RepairOrderStopEnum;
import com.hcy.common.exception.OperateException;
import com.hcy.common.mapper.client.ClientContactsMapper;
import com.hcy.common.mapper.client.ClientMapper;
import com.hcy.common.mapper.fault.FaultMapper;
import com.hcy.common.mapper.order.*;
@ -39,6 +41,7 @@ import com.hcy.common.mapper.system.SystemAuthAdminMapper;
import com.hcy.common.mapper.user.UserMapper;
import com.hcy.common.utils.StringUtil;
import com.hcy.common.utils.TimeUtil;
import com.hcy.common.utils.excel.CustomImageModifyHandler;
import com.hcy.common.utils.excel.LocalImageModifyStrategy;
import org.springframework.beans.BeanUtils;
import org.springframework.core.io.ClassPathResource;
@ -97,6 +100,9 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService {
@Resource
SparePartMapper sparePartMapper;
@Resource
ClientContactsMapper clientContactsMapper;
/**
*
*
@ -289,6 +295,25 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService {
}
}
//当登录的角色是客户角色的时候,工单列表只查这个客户的数据 1-客户-主管人员 2-客户-客服人员 11-客户-采购员
//1、判断当前用户角色是否是客户角色
SystemAuthAdmin systemAuthAdminById = systemAuthAdminMapper.findSystemAuthAdminById(AdminThreadLocal.getAdminId());
//1、1获取当前用户所属的客户
ClientContacts clientContacts = clientContactsMapper.findClientContactsByAdminId(Long.valueOf(systemAuthAdminById.getId()));
//1、2获取当前用户的角色
String role = systemAuthAdminById.getRole();
String[] roleStrings = role.split(","); // 分割字符串
int[] roles = new int[roleStrings.length]; // 创建一个整数数组来存储转换后的数字
for (int i = 0; i < roleStrings.length; i++) {
roles[i] = Integer.parseInt(roleStrings[i]); // 将字符串转换为整数
}
// 输出转换后的整数数组
for (int num : roles) {
if(num == 1 || num == 2 || num == 11){
parentRepairOrderDto.setClientId(clientContacts.getClientId());
}
}
// 2、 根据条件去查询出维修单信息
IPage<ParentRepairOrderDto> iPage = parentRepairOrderMapper.dispatchItemList(new Page<>(page, limit), parentRepairOrderDto);
@ -398,6 +423,10 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService {
// 设置每张图片的宽度为 100px转换因子为 32
new LocalImageModifyStrategy(100, 32))
.build();
//在不再需要线程池时,应该关闭它
LocalImageModifyStrategy localImageModifyStrategy = new LocalImageModifyStrategy();
localImageModifyStrategy.shutdownAndAwaitTermination();
//公共数据
OfferDetailEntity offerDetail = new OfferDetailEntity();
//入仓单

View File

@ -17,9 +17,11 @@ import com.hcy.common.core.PageResult;
import com.hcy.common.dto.order.OrderSparePart;
import com.hcy.common.dto.order.RepairOrderAuditDto;
import com.hcy.common.entity.client.Client;
import com.hcy.common.entity.client.ClientContacts;
import com.hcy.common.entity.fault.Fault;
import com.hcy.common.entity.order.*;
import com.hcy.common.entity.sparePart.SparePart;
import com.hcy.common.entity.system.SystemAuthAdmin;
import com.hcy.common.entity.user.User;
import com.hcy.common.entity.warehouse.Warehouse;
import com.hcy.common.enums.audit.AuditStateEnum;
@ -27,10 +29,12 @@ import com.hcy.common.enums.order.RepairOrderAuditStatusEnum;
import com.hcy.common.enums.order.RepairOrderStatusEnum;
import com.hcy.common.enums.order.RepairOrderStopEnum;
import com.hcy.common.exception.OperateException;
import com.hcy.common.mapper.client.ClientContactsMapper;
import com.hcy.common.mapper.client.ClientMapper;
import com.hcy.common.mapper.fault.FaultMapper;
import com.hcy.common.mapper.order.*;
import com.hcy.common.mapper.sparePart.SparePartMapper;
import com.hcy.common.mapper.system.SystemAuthAdminMapper;
import com.hcy.common.mapper.user.UserMapper;
import com.hcy.common.mapper.warehouse.WarehouseMapper;
import com.hcy.common.plugin.notice.engine.SmsNotice;
@ -84,6 +88,12 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService {
@Resource
WarehouseMapper warehouseMapper;
@Resource
SystemAuthAdminMapper systemAuthAdminMapper;
@Resource
ClientContactsMapper clientContactsMapper;
/**
*
*
@ -544,6 +554,25 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService {
RepairOrderAuditDto repairOrderAuditDto = new RepairOrderAuditDto();
BeanUtils.copyProperties(repairOrderAuditParam,repairOrderAuditDto);
//当登录的角色是客户角色的时候,工单列表只查这个客户的数据 1-客户-主管人员 2-客户-客服人员 11-客户-采购员
//1、判断当前用户角色是否是客户角色
SystemAuthAdmin systemAuthAdminById = systemAuthAdminMapper.findSystemAuthAdminById(AdminThreadLocal.getAdminId());
//1、1获取当前用户所属的客户
ClientContacts clientContacts = clientContactsMapper.findClientContactsByAdminId(Long.valueOf(systemAuthAdminById.getId()));
//1、2获取当前用户的角色
String role = systemAuthAdminById.getRole();
String[] roleStrings = role.split(","); // 分割字符串
int[] roles = new int[roleStrings.length]; // 创建一个整数数组来存储转换后的数字
for (int i = 0; i < roleStrings.length; i++) {
roles[i] = Integer.parseInt(roleStrings[i]); // 将字符串转换为整数
}
// 输出转换后的整数数组
for (int num : roles) {
if(num == 1 || num == 2 || num == 11){
repairOrderAuditDto.setClientId(clientContacts.getClientId());
}
}
IPage<RepairOrderAuditDto> iPage = repairOrderAuditMapper.auditMattersList(new Page<>(page, limit), repairOrderAuditDto);
List<RepairOrderAuditListVo> list = new LinkedList<>();
for(RepairOrderAuditDto item : iPage.getRecords()) {

View File

@ -16,6 +16,7 @@ import com.hcy.common.constant.GlobalConstant;
import com.hcy.common.core.PageResult;
import com.hcy.common.dto.RoutingInspectionOrderDto;
import com.hcy.common.entity.client.Client;
import com.hcy.common.entity.client.ClientContacts;
import com.hcy.common.entity.client.Equipment;
import com.hcy.common.entity.fault.Fault;
import com.hcy.common.entity.order.MaintenanceOrder;
@ -26,6 +27,7 @@ import com.hcy.common.entity.user.User;
import com.hcy.common.enums.order.MaintenanceOrderStatusEnum;
import com.hcy.common.enums.order.OrderOperateRecordEnum;
import com.hcy.common.enums.order.OrderStateEnum;
import com.hcy.common.mapper.client.ClientContactsMapper;
import com.hcy.common.mapper.client.ClientMapper;
import com.hcy.common.mapper.client.EquipmentMapper;
import com.hcy.common.mapper.fault.FaultMapper;
@ -77,6 +79,9 @@ public class RoutingInspectionOrderServiceImpl implements IRoutingInspectionOrde
@Resource
OrderOperateRecordMapper orderOperateRecordMapper;
@Resource
ClientContactsMapper clientContactsMapper;
/**
*
*
@ -106,6 +111,25 @@ public class RoutingInspectionOrderServiceImpl implements IRoutingInspectionOrde
inspectionOrderDto.setClientId(Long.valueOf(params.get("clientId")));
}
//当登录的角色是客户角色的时候,工单列表只查这个客户的数据 1-客户-主管人员 2-客户-客服人员 11-客户-采购员
//1、判断当前用户角色是否是客户角色
SystemAuthAdmin systemAuthAdminById = systemAuthAdminMapper.findSystemAuthAdminById(AdminThreadLocal.getAdminId());
//1、1获取当前用户所属的客户
ClientContacts clientContacts = clientContactsMapper.findClientContactsByAdminId(Long.valueOf(systemAuthAdminById.getId()));
//1、2获取当前用户的角色
String role = systemAuthAdminById.getRole();
String[] roleStrings = role.split(","); // 分割字符串
int[] roles = new int[roleStrings.length]; // 创建一个整数数组来存储转换后的数字
for (int i = 0; i < roleStrings.length; i++) {
roles[i] = Integer.parseInt(roleStrings[i]); // 将字符串转换为整数
}
// 输出转换后的整数数组
for (int num : roles) {
if(num == 1 || num == 2 || num == 11){
inspectionOrderDto.setClientId(clientContacts.getClientId());
}
}
Page<RoutingInspectionOrderDto> iPage = routingInspectionOrderMapper.pageList(page, inspectionOrderDto);
List<RoutingInspectionOrderListVo> list = new LinkedList<>();

View File

@ -315,8 +315,13 @@ public class SparePartStockAuditServiceImpl implements ISparePartStockAuditServi
}
}
//获取审核人名称
SystemAuthAdmin responsiblePerson = systemAuthAdminMapper.selectOne(new LambdaQueryWrapper<SystemAuthAdmin>()
.eq(SystemAuthAdmin::getId, item.getAuditorId())
.eq(SystemAuthAdmin::getIsDelete, GlobalConstant.NOT_DELETE));// 审核人id
if(responsiblePerson != null){
vo.setResponsiblePerson(responsiblePerson.getUsername()); //经办人/审核人
}
list.add(vo);
}
@ -396,6 +401,13 @@ public class SparePartStockAuditServiceImpl implements ISparePartStockAuditServi
for (SparePartAudit sparePartAudit : sparePartAuditList) {
SparePartAuditListVo sparePartAuditListVo = new SparePartAuditListVo();
BeanUtils.copyProperties(sparePartAudit, sparePartAuditListVo);
//所属仓库名称
Warehouse warehouseName = warehouseMapper.findWarehouseById(sparePartAudit.getWarehouseId());
if(warehouseName != null){
sparePartAuditListVo.setWarehouseName(warehouseName.getWarehouseName());
}
listVo.add(sparePartAuditListVo);
}
vo.setSparePartAuditList(listVo);
@ -775,7 +787,7 @@ public class SparePartStockAuditServiceImpl implements ISparePartStockAuditServi
model.setPurchaseStatus(sparePartStockAuditParam.getPurchaseStatus());//配件采购状态0=待审核1=未通过2=待管理员审核3=待发货4=待收货5=已完成6=填写中7=收货超期)
model.setReceiveStatus(sparePartStockAuditParam.getReceiveStatus());// 配件领用状态0=未审核1=审核未通过2=待领取3=待确认4=已完成)
model.setPurchaseIdea(sparePartStockAuditParam.getPurchaseIdea()); // 采购意见
model.setAuditIdea(sparePartStockAuditParam.getAuditIdea()); // 审核意见
//配件采购
if(sparePartStockAuditParam.getPurchaseStatus() != null){
//仓管员检修单审核不通过
@ -835,7 +847,7 @@ public class SparePartStockAuditServiceImpl implements ISparePartStockAuditServi
// 出库时需要判断库存数量是否大于出库数量,大于才允许出库;反之,提示备件库存数量不足
if (sparePart.getQuantity() >= sparePartAudit.getCount()) {
model.setAuditState(AuditStateEnum.UNREVIEWED.getStatus());
sparePart.setQuantity(sparePart.getQuantity() - sparePartAudit.getCount());
// sparePart.setQuantity(sparePart.getQuantity() - sparePartAudit.getCount());
} else {
throw new OperateException("备件库存数量不足,请联系客服人员!");
}

View File

@ -444,6 +444,8 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService {
//更新admin信息
BeanUtils.copyProperties(systemAuthAdminParam, systemAuthAdmin);
//
// systemAuthAdmin.setAvatar(systemAuthAdminParam.getAvatar());
//判断当前参数是否可以小程序登录
boolean mnpLogin = iSystemAuthRoleService.isMnpLogin(systemAuthAdminParam.getRole());

View File

@ -65,8 +65,8 @@ public class SystemAuthAdminParam implements Serializable {
private Integer postId = 0;
private String avatar = "";
// private String avatar = "";
private String avatar;
private String phone; // 联系电话
private Integer plantId; // 管辖工厂
private Long provinceId; //省id

View File

@ -67,4 +67,8 @@ public class SparePartStockAuditDetailVo implements Serializable {
private Long auditorId; // 审核人id
private String responsiblePerson; // 经办人、
private String warehouseKeeperImg; // 仓管员上传图片
private String purchaseIdea; //采购意见
private Date consignerTime; //发货时间
private Integer creatorId; // 创建人id
}

View File

@ -230,8 +230,15 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
<version>4.0.2</version>
</dependency>
<!-- CollectionUtils工具类-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<!-- netty网络框架 -->
<dependency>
<groupId>io.netty</groupId>
@ -275,6 +282,12 @@
<scope>compile</scope>
</dependency>
<!--Thumbnailator库作为图片压缩-->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
</dependencies>
</project>

View File

@ -56,4 +56,5 @@ public class RepairOrderAuditDto implements Serializable {
private String questionOne; // 问题1
private String questionTwo; // 问题2
private String questionThree; // 问题3
private Long clientId; //客户id
}

View File

@ -15,4 +15,6 @@ public interface ClientContactsMapper extends IBaseMapper<ClientContacts> {
@Select("select * from la_client_contacts where is_delete = 0 and user_id = #{userId}")
ClientContacts findClientContactsByUserId(@Param("userId") Long userId);
@Select("select * from la_client_contacts where is_delete = 0 and admin_id = #{adminId}")
ClientContacts findClientContactsByAdminId(@Param("adminId") Long adminId);
}

View File

@ -0,0 +1,150 @@
package com.hcy.common.utils.excel;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.ImageData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.Units;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFShape;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicReference;
public class CustomImageModifyHandler implements CellWriteHandler {
/**
* Cell
*/
private final CopyOnWriteArrayList<String> REPEATS = new CopyOnWriteArrayList<>();
/**
*
*/
private final AtomicReference<Integer> MAX_IMAGE_SIZE = new AtomicReference<>(0);
/**
* EasyExcel
*/
private final CopyOnWriteArrayList<Integer> CREATE_PIC_INDEX = new CopyOnWriteArrayList<>();
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
// 在 数据转换成功后 不是头就把类型设置成空
if (isHead) {
return;
}
//将要插入图片的单元格的type设置为空,下面再填充图片
if (CollectionUtils.isNotEmpty(cellData.getImageDataList())) {
cellData.setType(CellDataTypeEnum.EMPTY);
}
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
// 在 单元格写入完毕后 ,自己填充图片
if (isHead || CollectionUtils.isEmpty(cellDataList)) {
return;
}
boolean listFlag = false;
Sheet sheet = cell.getSheet();
// 此处为ExcelUrlConverterUtil的返回值
List<ImageData> imageDataList = cellDataList.get(0).getImageDataList();
if (CollectionUtils.isNotEmpty(imageDataList)) {
listFlag = true;
}
if (!listFlag && imageDataList == null) {
return;
}
String key = cell.getRowIndex() + "_" + cell.getColumnIndex();
if (REPEATS.contains(key)) {
return;
}
REPEATS.add(key);
if (imageDataList.size() > MAX_IMAGE_SIZE.get()) {
MAX_IMAGE_SIZE.set(imageDataList.size());
}
// 默认要导出的图片大小为60*60px,60px的行高大约是900,60px列宽大概是248*8
sheet.getRow(cell.getRowIndex()).setHeight((short) 900);
sheet.setColumnWidth(cell.getColumnIndex(), listFlag ? 240 * 8 * MAX_IMAGE_SIZE.get() : 240 * 8);
if (listFlag) {
for (int i = 0; i < imageDataList.size(); i++) {
ImageData imageData = imageDataList.get(i);
if (imageData == null) {
continue;
}
byte[] image = imageData.getImage();
this.insertImage(sheet, cell, image, i);
}
} else {
this.insertImage(sheet, cell, imageDataList.get(0).getImage(), 0);
}
// 清除EasyExcel自动添加的没有格式的图片
XSSFDrawing drawingPatriarch = (XSSFDrawing) sheet.getDrawingPatriarch();
List<XSSFShape> shapes = drawingPatriarch.getShapes();
for (int i = 0; i < shapes.size(); i++) {
XSSFShape shape = shapes.get(i);
if (shape instanceof XSSFPicture && !CREATE_PIC_INDEX.contains(i)) {
CREATE_PIC_INDEX.add(i);
XSSFPicture picture = (XSSFPicture) shape;
picture.resize(0);
}
}
}
/**
*
*
* @param sheet Excel
* @param cell
* @param pictureData
* @param i
*/
private void insertImage(Sheet sheet, Cell cell, byte[] pictureData, int i) {
int picWidth = Units.pixelToEMU(60);
int index = sheet.getWorkbook().addPicture(pictureData, HSSFWorkbook.PICTURE_TYPE_PNG);
CREATE_PIC_INDEX.add(index);
Drawing<?> drawing = sheet.getDrawingPatriarch();
if (drawing == null) {
drawing = sheet.createDrawingPatriarch();
}
CreationHelper helper = sheet.getWorkbook().getCreationHelper();
ClientAnchor anchor = helper.createClientAnchor();
// 设置图片坐标
anchor.setDx1(picWidth * i);
anchor.setDx2(picWidth + picWidth * i);
anchor.setDy1(0);
anchor.setDy2(0);
//设置图片位置
int columnIndex = cell.getColumnIndex();
anchor.setCol1(columnIndex);
anchor.setCol2(columnIndex);
int rowIndex = cell.getRowIndex();
anchor.setRow1(rowIndex);
anchor.setRow2(rowIndex + 1);
anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
drawing.createPicture(anchor, index);
}
}

View File

@ -0,0 +1,66 @@
package com.hcy.common.utils.excel;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ImageData;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.IoUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class ExcelUrlConverterUtil implements Converter<List<URL>> {
@Override
public Class supportJavaTypeKey() {
return List.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.EMPTY;
}
@Override
public List convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return null;
}
@Override
public WriteCellData<?> convertToExcelData(List<URL> value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
// 这里进行对数据实体类URL集合处理
List<ImageData> data = new ArrayList<>();
ImageData imageData;
// for 循环一次读取
for (URL url : value) {
try (InputStream inputStream = url.openStream();) {
byte[] bytes = IoUtils.toByteArray(inputStream);
imageData = new ImageData();
imageData.setImage(bytes);
data.add(imageData);
} catch (Exception e) {
log.error("导出临时记录图片异常:", e);
}
}
WriteCellData<?> cellData = new WriteCellData<>();
if (CollectionUtils.isNotEmpty(data)) {
// 图片返回图片列表
cellData.setImageDataList(data);
cellData.setType(CellDataTypeEnum.EMPTY);
} else {
// 没有图片使用汉字表示
cellData.setStringValue("无图");
cellData.setType(CellDataTypeEnum.STRING);
}
return cellData;
}
}

View File

@ -0,0 +1,25 @@
package com.hcy.common.utils.excel;
import net.coobird.thumbnailator.Thumbnails;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class FileUtil {
/**
*
*
* @param inputStream
* @param outputStream
* @param quality (0.0 1.01.0)
* @throws IOException
*/
public static void compressImage(InputStream inputStream, OutputStream outputStream, float quality) throws IOException {
// 使用Thumbnailator进行压缩
Thumbnails.of(inputStream)
.scale(1.0) // 保持原始尺寸
.outputQuality(quality)
.toOutputStream(outputStream);
}
}

View File

@ -12,8 +12,16 @@ import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.Units;
import org.springframework.util.CollectionUtils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
/**
@ -47,6 +55,9 @@ public class LocalImageModifyStrategy implements CellWriteHandler {
*/
private final int pixelConversionFactor;
// 创建一个固定大小的线程池
private final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public LocalImageModifyStrategy() {
this.imageWidth = DEFAULT_IMAGE_WIDTH;
this.pixelConversionFactor = DEFAULT_PIXEL_CONVERSION_FACTOR;
@ -103,16 +114,70 @@ public class LocalImageModifyStrategy implements CellWriteHandler {
int widthValue = imageWidth * pixelConversionFactor;
sheet.setColumnWidth(cell.getColumnIndex(), widthValue * MAX_IMAGE_SIZE.get() + pixelConversionFactor);
// for (int i = 0; i < filePaths.size(); i++) {
// String filePath = filePaths.get(i);
// // todo 这里可以对图片作一些处理,比如说压缩
// try {
// compressImage(filePath);
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// // 读取文件
// byte[] image = FileUtil.readBytes(filePath);
// this.insertImage(sheet, cell, image, i);
// }
// 使用线程池来并行处理图片插入
// List<String> filePaths = Arrays.asList(stringValue.split(","));
for (int i = 0; i < filePaths.size(); i++) {
String filePath = filePaths.get(i);
// todo 这里可以对图片作一些处理,比如说压缩
// ...
// 读取文件
int finalI = i;
executorService.submit(() -> {
try {
//压缩图片
compressImage(filePath);
} catch (IOException e) {
throw new RuntimeException(e);
}
byte[] image = FileUtil.readBytes(filePath);
this.insertImage(sheet, cell, image, i);
insertImage(sheet, cell, image, finalI);
});
}
}
/**
*
*
* @param filePath
* @throws IOException
*/
public void compressImage(String filePath) throws IOException {
// 读取原始图像文件
File inputFile = new File(filePath);
BufferedImage inputImage = ImageIO.read(inputFile);
// 获取原始图像的宽度和高度
int scaledWidth = inputImage.getWidth() / 2;
int scaledHeight = inputImage.getHeight() / 2;
// 创建一个新图像,宽度和高度是原始图像的一半
BufferedImage outputImage = new BufferedImage(scaledWidth, scaledHeight, inputImage.getType());
// 绘制缩放后的图像
Graphics2D g2d = outputImage.createGraphics();
g2d.drawImage(inputImage, 0, 0, scaledWidth, scaledHeight, null);
g2d.dispose();
// 设置压缩质量参数
float quality = 0.5f; // 压缩质量范围从0.0f到1.0f
// 将压缩后的图像写入文件
File outputFile = new File(filePath);
ImageIO.write(outputImage, "jpg", outputFile);
// 可以选择删除原始文件
// inputFile.delete();
}
/**
*
@ -150,5 +215,24 @@ public class LocalImageModifyStrategy implements CellWriteHandler {
drawing.createPicture(anchor, index);
return index;
}
// 在不再需要线程池时,应该关闭它
public void shutdownAndAwaitTermination() {
executorService.shutdown(); // 禁止提交新任务
try {
// 等待现有任务终止
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
executorService.shutdownNow(); // 取消正在执行的任务
// 等待任务响应取消
if (!executorService.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("线程池未正常终止");
}
} catch (InterruptedException ie) {
// 重新取消当前线程进行中断
executorService.shutdownNow();
// 保留中断状态
Thread.currentThread().interrupt();
}
}
}

View File

@ -9,6 +9,9 @@
LEFT JOIN la_user as u on pro.creator_id = u.id
where
pro.is_delete = 0
<if test="param.clientId != null">
and pro.client_id = #{param.clientId}
</if>
<if test="param.orderNo != null and param.orderNo != ''">
and pro.order_no like concat('%', #{param.orderNo}, '%')
</if>

View File

@ -17,6 +17,9 @@
LEFT JOIN la_repair_order_audit AS roa ON ro.id = roa.repair_order_id
WHERE
ro.is_delete = 0
<if test="param.clientId != null">
AND ro.client_id = #{param.clientId}
</if>
<if test="param.reviewRequest != null">
AND roa.review_request = #{param.reviewRequest}
</if>

View File

@ -2391,7 +2391,7 @@ public class RepairOrderServiceImpl implements IRepairOrderService {
//维修单步骤数据
RepairOrderStepData requestRepairOrderStepData = new RepairOrderStepData();
requestRepairOrderStepData.setRepairOrderId(order.getId());// 维修单id
requestRepairOrderStepData.setRemark("退仓申请已完成,退仓原因:" + reasonForWithdrawal);// 备注
requestRepairOrderStepData.setRemark("退仓申请已完成,难修原因:" + reasonForWithdrawal);// 备注
requestRepairOrderStepData.setTitle("退仓已完成"); // 标题
requestRepairOrderStepData.setCreatorId(FrontThreadLocal.getUserId().longValue()); //创建人
requestRepairOrderStepData.setCreateTime(new Date()); // 创建时间

24
pom.xml
View File

@ -172,9 +172,31 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.4</version>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<!--pdf模板导出-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.4</version>
</dependency>
<!-- PDF中文支持 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13.1</version>
</dependency>
</dependencies>
</dependencyManagement>