【admin&front】 新增&优化 1、优化客户新增客户编号电话号码唯一 2、优化excel导出图片多线程压缩
parent
8058ce8a52
commit
f8e92b0b48
|
@ -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())
|
||||
.or()
|
||||
.eq(Client::getClientNo, clientParam.getClientNo());
|
||||
.and(query -> query.eq(Client::getPhone, clientParam.getPhone())
|
||||
.or()
|
||||
.eq(Client::getClientNo, clientParam.getClientNo()));
|
||||
|
||||
Integer count = clientMapper.selectCount(queryWrapper);
|
||||
if(count > 0){
|
||||
|
|
|
@ -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,51 +461,57 @@ 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){
|
||||
//原本派单方式
|
||||
String oldReceiverType;
|
||||
if(model.getReceiverType() == 0){
|
||||
oldReceiverType = OrderStateEnum.REGIONAL_DISPATCH.getDesc();
|
||||
}else{
|
||||
oldReceiverType = OrderStateEnum.DISTANCE_ORDER.getDesc();
|
||||
}
|
||||
//现在派单方式
|
||||
String newReceiverType;
|
||||
if(param.getReceiverType() == 0){
|
||||
newReceiverType = OrderStateEnum.REGIONAL_DISPATCH.getDesc();
|
||||
}else{
|
||||
newReceiverType = OrderStateEnum.DISTANCE_ORDER.getDesc();
|
||||
//如果原本派单方式跟现在派单方式不一样就进行修改
|
||||
if(!Objects.equals(model.getReceiverType(), param.getReceiverType())){
|
||||
//原本派单方式
|
||||
String oldReceiverType;
|
||||
if(model.getReceiverType() == 0){
|
||||
oldReceiverType = OrderStateEnum.REGIONAL_DISPATCH.getDesc();
|
||||
}else{
|
||||
oldReceiverType = OrderStateEnum.DISTANCE_ORDER.getDesc();
|
||||
}
|
||||
//现在派单方式
|
||||
String newReceiverType;
|
||||
if(param.getReceiverType() == 0){
|
||||
newReceiverType = OrderStateEnum.REGIONAL_DISPATCH.getDesc();
|
||||
}else{
|
||||
newReceiverType = OrderStateEnum.DISTANCE_ORDER.getDesc();
|
||||
}
|
||||
|
||||
//新增订单操作记录
|
||||
orderOperateRecordService.addMaintenanceOrder(model.getId()
|
||||
,OrderOperateRecordEnum.ALTER_RECEIVER_TYPE.getDesc()
|
||||
,"【"+AdminThreadLocal.get("username")+"】已修改派单方式。原本派单方式为:" +
|
||||
oldReceiverType + ",已修改派单方式为:" + newReceiverType + "。");
|
||||
}
|
||||
|
||||
//新增订单操作记录
|
||||
orderOperateRecordService.addMaintenanceOrder(model.getId()
|
||||
,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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
//入仓单
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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<>();
|
||||
|
|
|
@ -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("备件库存数量不足,请联系客服人员!");
|
||||
}
|
||||
|
|
|
@ -444,6 +444,8 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService {
|
|||
|
||||
//更新admin信息
|
||||
BeanUtils.copyProperties(systemAuthAdminParam, systemAuthAdmin);
|
||||
//
|
||||
// systemAuthAdmin.setAvatar(systemAuthAdminParam.getAvatar());
|
||||
|
||||
//判断当前参数是否可以小程序登录
|
||||
boolean mnpLogin = iSystemAuthRoleService.isMnpLogin(systemAuthAdminParam.getRole());
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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>
|
|
@ -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
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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.0,1.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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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 这里可以对图片作一些处理,比如说压缩
|
||||
// ...
|
||||
// 读取文件
|
||||
byte[] image = FileUtil.readBytes(filePath);
|
||||
this.insertImage(sheet, cell, image, i);
|
||||
int finalI = i;
|
||||
executorService.submit(() -> {
|
||||
try {
|
||||
//压缩图片
|
||||
compressImage(filePath);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
byte[] image = FileUtil.readBytes(filePath);
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
24
pom.xml
|
@ -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>
|
||||
|
||||
|
|
Loading…
Reference in New Issue