From f8e92b0b48c279f44ae75290619f7d39f0345ca9 Mon Sep 17 00:00:00 2001 From: renfan <2206580733@qq.com> Date: Mon, 4 Nov 2024 18:25:42 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90admin&front=E3=80=91=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E&=E4=BC=98=E5=8C=96=201=E3=80=81=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=96=B0=E5=A2=9E=E5=AE=A2=E6=88=B7=E7=BC=96?= =?UTF-8?q?=E5=8F=B7=E7=94=B5=E8=AF=9D=E5=8F=B7=E7=A0=81=E5=94=AF=E4=B8=80?= =?UTF-8?q?=202=E3=80=81=E4=BC=98=E5=8C=96excel=E5=AF=BC=E5=87=BA=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=A4=9A=E7=BA=BF=E7=A8=8B=E5=8E=8B=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/impl/ClientServiceImpl.java | 6 +- .../impl/MaintenanceOrderServiceImpl.java | 71 ++++++--- .../impl/ParentRepairOrderServiceImpl.java | 29 ++++ .../impl/RepairOrderAuditServiceImpl.java | 29 ++++ .../RoutingInspectionOrderServiceImpl.java | 24 +++ .../impl/SparePartStockAuditServiceImpl.java | 20 ++- .../impl/SystemAuthAdminServiceImpl.java | 2 + .../validate/system/SystemAuthAdminParam.java | 4 +- .../SparePartStockAuditDetailVo.java | 4 + common/pom.xml | 15 +- .../common/dto/order/RepairOrderAuditDto.java | 1 + .../mapper/client/ClientContactsMapper.java | 2 + .../utils/excel/CustomImageModifyHandler.java | 150 ++++++++++++++++++ .../utils/excel/ExcelUrlConverterUtil.java | 66 ++++++++ .../com/hcy/common/utils/excel/FileUtil.java | 25 +++ .../utils/excel/LocalImageModifyStrategy.java | 94 ++++++++++- .../mapper/ParentRepairOrderMapper.xml | 3 + .../mapper/RepairOrderAuditMapper.xml | 3 + .../order/impl/RepairOrderServiceImpl.java | 2 +- pom.xml | 24 ++- 20 files changed, 535 insertions(+), 39 deletions(-) create mode 100644 common/src/main/java/com/hcy/common/utils/excel/CustomImageModifyHandler.java create mode 100644 common/src/main/java/com/hcy/common/utils/excel/ExcelUrlConverterUtil.java create mode 100644 common/src/main/java/com/hcy/common/utils/excel/FileUtil.java diff --git a/admin/src/main/java/com/hcy/admin/service/client/impl/ClientServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/client/impl/ClientServiceImpl.java index 7bbeb00..07755b0 100644 --- a/admin/src/main/java/com/hcy/admin/service/client/impl/ClientServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/client/impl/ClientServiceImpl.java @@ -142,9 +142,9 @@ public class ClientServiceImpl implements IClientService { public void add(ClientParam clientParam) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .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){ diff --git a/admin/src/main/java/com/hcy/admin/service/order/impl/MaintenanceOrderServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/order/impl/MaintenanceOrderServiceImpl.java index 7ca6ef6..9fe5ad4 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/impl/MaintenanceOrderServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/order/impl/MaintenanceOrderServiceImpl.java @@ -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 iPage = maintenanceOrderMapper.list(new Page<>(page, limit), maintenanceOrderDto); List 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 queryWrapper = new LambdaQueryWrapper() .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); } diff --git a/admin/src/main/java/com/hcy/admin/service/order/impl/ParentRepairOrderServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/order/impl/ParentRepairOrderServiceImpl.java index 10ae633..fd0dcfe 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/impl/ParentRepairOrderServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/order/impl/ParentRepairOrderServiceImpl.java @@ -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 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(); //入仓单 diff --git a/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderAuditServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderAuditServiceImpl.java index e6bbbf7..eaf3c8c 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderAuditServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderAuditServiceImpl.java @@ -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 iPage = repairOrderAuditMapper.auditMattersList(new Page<>(page, limit), repairOrderAuditDto); List list = new LinkedList<>(); for(RepairOrderAuditDto item : iPage.getRecords()) { diff --git a/admin/src/main/java/com/hcy/admin/service/order/impl/RoutingInspectionOrderServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/order/impl/RoutingInspectionOrderServiceImpl.java index d3357b2..f69d20f 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/impl/RoutingInspectionOrderServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/order/impl/RoutingInspectionOrderServiceImpl.java @@ -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 iPage = routingInspectionOrderMapper.pageList(page, inspectionOrderDto); List list = new LinkedList<>(); diff --git a/admin/src/main/java/com/hcy/admin/service/sparePartStockAudit/impl/SparePartStockAuditServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/sparePartStockAudit/impl/SparePartStockAuditServiceImpl.java index f8e8858..02059b8 100644 --- a/admin/src/main/java/com/hcy/admin/service/sparePartStockAudit/impl/SparePartStockAuditServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/sparePartStockAudit/impl/SparePartStockAuditServiceImpl.java @@ -315,8 +315,13 @@ public class SparePartStockAuditServiceImpl implements ISparePartStockAuditServi } } - - + //获取审核人名称 + SystemAuthAdmin responsiblePerson = systemAuthAdminMapper.selectOne(new LambdaQueryWrapper() + .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("备件库存数量不足,请联系客服人员!"); } diff --git a/admin/src/main/java/com/hcy/admin/service/system/impl/SystemAuthAdminServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/system/impl/SystemAuthAdminServiceImpl.java index 3d50fbc..1f1fd2c 100644 --- a/admin/src/main/java/com/hcy/admin/service/system/impl/SystemAuthAdminServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/system/impl/SystemAuthAdminServiceImpl.java @@ -444,6 +444,8 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { //更新admin信息 BeanUtils.copyProperties(systemAuthAdminParam, systemAuthAdmin); + // +// systemAuthAdmin.setAvatar(systemAuthAdminParam.getAvatar()); //判断当前参数是否可以小程序登录 boolean mnpLogin = iSystemAuthRoleService.isMnpLogin(systemAuthAdminParam.getRole()); diff --git a/admin/src/main/java/com/hcy/admin/validate/system/SystemAuthAdminParam.java b/admin/src/main/java/com/hcy/admin/validate/system/SystemAuthAdminParam.java index 05e300e..1c178e6 100644 --- a/admin/src/main/java/com/hcy/admin/validate/system/SystemAuthAdminParam.java +++ b/admin/src/main/java/com/hcy/admin/validate/system/SystemAuthAdminParam.java @@ -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 diff --git a/admin/src/main/java/com/hcy/admin/vo/sparePartStockAudit/SparePartStockAuditDetailVo.java b/admin/src/main/java/com/hcy/admin/vo/sparePartStockAudit/SparePartStockAuditDetailVo.java index 6da8ebd..7e90d0a 100644 --- a/admin/src/main/java/com/hcy/admin/vo/sparePartStockAudit/SparePartStockAuditDetailVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/sparePartStockAudit/SparePartStockAuditDetailVo.java @@ -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 } diff --git a/common/pom.xml b/common/pom.xml index ab74b75..e1ff4b3 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -230,8 +230,15 @@ com.alibaba easyexcel - 3.0.5 + 4.0.2 + + + org.apache.commons + commons-collections4 + 4.4 + + io.netty @@ -275,6 +282,12 @@ compile + + + net.coobird + thumbnailator + 0.4.20 + \ No newline at end of file diff --git a/common/src/main/java/com/hcy/common/dto/order/RepairOrderAuditDto.java b/common/src/main/java/com/hcy/common/dto/order/RepairOrderAuditDto.java index 050c899..f8dcb7e 100644 --- a/common/src/main/java/com/hcy/common/dto/order/RepairOrderAuditDto.java +++ b/common/src/main/java/com/hcy/common/dto/order/RepairOrderAuditDto.java @@ -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 } \ No newline at end of file diff --git a/common/src/main/java/com/hcy/common/mapper/client/ClientContactsMapper.java b/common/src/main/java/com/hcy/common/mapper/client/ClientContactsMapper.java index 543def2..66e3c3d 100644 --- a/common/src/main/java/com/hcy/common/mapper/client/ClientContactsMapper.java +++ b/common/src/main/java/com/hcy/common/mapper/client/ClientContactsMapper.java @@ -15,4 +15,6 @@ public interface ClientContactsMapper extends IBaseMapper { @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); } diff --git a/common/src/main/java/com/hcy/common/utils/excel/CustomImageModifyHandler.java b/common/src/main/java/com/hcy/common/utils/excel/CustomImageModifyHandler.java new file mode 100644 index 0000000..f895db6 --- /dev/null +++ b/common/src/main/java/com/hcy/common/utils/excel/CustomImageModifyHandler.java @@ -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 REPEATS = new CopyOnWriteArrayList<>(); + /** + * 单元格的图片最大张数(每列的单元格图片张数不确定,单元格宽度需按照张数最多的长度来设置) + */ + private final AtomicReference MAX_IMAGE_SIZE = new AtomicReference<>(0); + + /** + * 标记手动添加的图片,用于排除EasyExcel自动添加的图片 + */ + private final CopyOnWriteArrayList 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> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + // 在 单元格写入完毕后 ,自己填充图片 + if (isHead || CollectionUtils.isEmpty(cellDataList)) { + return; + } + boolean listFlag = false; + Sheet sheet = cell.getSheet(); + // 此处为ExcelUrlConverterUtil的返回值 + List 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 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); + } +} diff --git a/common/src/main/java/com/hcy/common/utils/excel/ExcelUrlConverterUtil.java b/common/src/main/java/com/hcy/common/utils/excel/ExcelUrlConverterUtil.java new file mode 100644 index 0000000..0469518 --- /dev/null +++ b/common/src/main/java/com/hcy/common/utils/excel/ExcelUrlConverterUtil.java @@ -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> { + @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 value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { + // 这里进行对数据实体类URL集合处理 + List 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; + } +} + diff --git a/common/src/main/java/com/hcy/common/utils/excel/FileUtil.java b/common/src/main/java/com/hcy/common/utils/excel/FileUtil.java new file mode 100644 index 0000000..e66880c --- /dev/null +++ b/common/src/main/java/com/hcy/common/utils/excel/FileUtil.java @@ -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); + } +} + diff --git a/common/src/main/java/com/hcy/common/utils/excel/LocalImageModifyStrategy.java b/common/src/main/java/com/hcy/common/utils/excel/LocalImageModifyStrategy.java index 59e06ae..97f60d4 100644 --- a/common/src/main/java/com/hcy/common/utils/excel/LocalImageModifyStrategy.java +++ b/common/src/main/java/com/hcy/common/utils/excel/LocalImageModifyStrategy.java @@ -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 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(); + } + } } diff --git a/common/src/main/resources/mapper/ParentRepairOrderMapper.xml b/common/src/main/resources/mapper/ParentRepairOrderMapper.xml index 57c3514..dc14100 100644 --- a/common/src/main/resources/mapper/ParentRepairOrderMapper.xml +++ b/common/src/main/resources/mapper/ParentRepairOrderMapper.xml @@ -9,6 +9,9 @@ LEFT JOIN la_user as u on pro.creator_id = u.id where pro.is_delete = 0 + + and pro.client_id = #{param.clientId} + and pro.order_no like concat('%', #{param.orderNo}, '%') diff --git a/common/src/main/resources/mapper/RepairOrderAuditMapper.xml b/common/src/main/resources/mapper/RepairOrderAuditMapper.xml index 8138961..bb8543b 100644 --- a/common/src/main/resources/mapper/RepairOrderAuditMapper.xml +++ b/common/src/main/resources/mapper/RepairOrderAuditMapper.xml @@ -17,6 +17,9 @@ LEFT JOIN la_repair_order_audit AS roa ON ro.id = roa.repair_order_id WHERE ro.is_delete = 0 + + AND ro.client_id = #{param.clientId} + AND roa.review_request = #{param.reviewRequest} diff --git a/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java b/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java index c585cb6..41e52f1 100644 --- a/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java +++ b/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java @@ -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()); // 创建时间 diff --git a/pom.xml b/pom.xml index 5dc3ee8..6e1c3b7 100644 --- a/pom.xml +++ b/pom.xml @@ -172,9 +172,31 @@ com.alibaba easyexcel - 3.3.4 + 4.0.2 + + + org.apache.commons + commons-collections4 + 4.4 + + + com.itextpdf + itextpdf + 5.5.13.4 + + + + com.itextpdf + itext-asian + 5.1.0 + + + com.itextpdf.tool + xmlworker + 5.5.13.1 +