From 8058ce8a523e51e4146d9c7ec854e6903710a78e Mon Sep 17 00:00:00 2001 From: renfan <2206580733@qq.com> Date: Tue, 29 Oct 2024 23:40: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=20#=201=E3=80=81=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=BB=B4=E4=BF=AE=E5=8D=95=E9=80=80?= =?UTF-8?q?=E4=BB=93=E7=94=B3=E8=AF=B7=202=E3=80=81=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=A0=B8=E5=AF=B9=E8=BF=94=E4=BF=AE=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=203=E3=80=81=E6=96=B0=E5=A2=9E=E9=80=80=E4=BB=93?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=EF=BC=8C=E6=8A=A5=E5=BA=9F=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=EF=BC=8C=E9=A2=86=E6=96=99=E7=94=B3=E8=AF=B7=EF=BC=8C=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E7=94=B3=E8=AF=B7=E5=AE=A1=E6=A0=B8=E4=B8=8D=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=8A=9F=E8=83=BD=204=E3=80=81=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=94=AF=E6=8C=81=E5=AF=BC=E5=87=BA=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E5=AE=A2=E6=88=B7=E7=9A=84=E9=A2=86=E6=9C=BA=E5=8D=95?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=EF=BC=8C=E9=A2=86=E6=9C=BA=E5=8D=95=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=88=B0=E8=B4=A7=E6=97=B6=E9=97=B4=E3=80=81=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E5=90=8D=E7=A7=B0=E3=80=81=E5=A4=87=E6=B3=A8=E3=80=81?= =?UTF-8?q?=E8=B4=A8=E4=BF=9D=E6=9C=9F=E9=99=90=EF=BC=9B=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E7=BB=B4=E4=BF=AE=E7=BB=93=E6=9E=9C=205=E3=80=81=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E9=99=A4=E7=BB=B4=E4=BF=AE=E4=BA=BA=E5=91=98=E5=A4=96?= =?UTF-8?q?=EF=BC=8C=E6=89=80=E6=9C=89=E5=8F=AF=E6=9F=A5=E7=9C=8B=E9=A2=86?= =?UTF-8?q?=E6=96=99=E6=98=8E=E7=BB=86=E9=83=BD=E9=9C=80=E8=A6=81=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=85=8D=E4=BB=B6=E5=8D=95=E4=BB=B7=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=9B=E9=85=8D=E4=BB=B6=E5=8D=95=E4=BB=B7=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E5=AE=A2=E6=88=B7=E9=85=8D=E4=BB=B6=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E5=9B=A0=E5=AD=90=20*=20=E5=8D=95=E4=BB=B7=206?= =?UTF-8?q?=E3=80=81=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=96=B0=E5=A2=9E=E6=8A=A5?= =?UTF-8?q?=E5=BA=9F=E6=B5=81=E7=A8=8B=E6=B7=BB=E5=8A=A0=E8=B4=A8=E6=A3=80?= =?UTF-8?q?=E6=AD=A5=E9=AA=A4=EF=BC=88=E4=B8=8A=E4=BC=A0=E5=9B=BE=E7=89=87?= =?UTF-8?q?+=E5=A4=87=E6=B3=A8=EF=BC=89=207=E3=80=81=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=A3=80=E4=BF=AE=E5=8D=95bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/client/ClientController.java | 1 + .../client/EquipmentController.java | 6 +- .../order/ParentRepairOrderController.java | 14 + .../order/RepairOrderAuditController.java | 12 +- .../order/RepairOrderController.java | 13 + .../sparePart/SparePartController.java | 1 + .../client/impl/ClientServiceImpl.java | 26 +- .../client/impl/EquipmentServiceImpl.java | 16 +- .../order/IParentRepairOrderService.java | 12 + .../order/IRepairOrderAuditService.java | 6 + .../service/order/IRepairOrderService.java | 13 +- .../impl/MaintenanceOrderServiceImpl.java | 29 +- .../impl/ParentRepairOrderServiceImpl.java | 502 ++++++++-- .../impl/RepairOrderAuditServiceImpl.java | 236 ++++- .../order/impl/RepairOrderServiceImpl.java | 237 ++++- .../impl/RepairOrderShippingServiceImpl.java | 1 + .../sparePart/impl/SparePartServiceImpl.java | 11 +- .../impl/SparePartStockAuditServiceImpl.java | 1 + .../impl/SystemAuthAdminServiceImpl.java | 7 + .../warehouse/impl/WarehouseServiceImpl.java | 26 +- .../admin/validate/client/ClientParam.java | 2 - .../validate/order/RepairOrderAuditParam.java | 6 + .../validate/system/SystemAuthAdminParam.java | 2 +- .../vo/excel/order/BeyondRepairOrder.java | 4 +- .../vo/excel/order/ClientCollarExcel.java | 89 ++ .../vo/excel/order/ClientCollerExcel.java | 50 + .../vo/excel/order/GetMaterialsOrder.java | 5 + .../vo/excel/order/MachineClaimNote.java | 17 +- .../hcy/admin/vo/excel/order/ScrapForm.java | 5 +- .../excel/order/WarehouseWarrantWIPExcel.java | 57 ++ .../admin/vo/largeData/UserLargeDataVo.java | 1 + .../admin/vo/order/OrderSparePartListVo.java | 2 +- .../vo/order/OrderSparePartUseListVo.java | 2 +- .../admin/vo/order/OrderSparePartUseVo.java | 2 +- .../vo/order/RepairOrderAuditDetailVo.java | 14 + .../vo/order/RepairOrderAuditListVo.java | 13 + .../admin/vo/order/RepairOrderDetailVo.java | 2 + .../hcy/admin/vo/order/RepairOrderListVo.java | 12 + .../vo/order/RepairOrderShippingListVo.java | 2 + .../admin/vo/order/RepairOrderStepDataVo.java | 1 + .../admin/vo/system/SystemAuthAdminVo.java | 2 +- .../templates/excel/ClientCollar.xlsx | Bin 0 -> 11379 bytes .../templates/excel/WarehouseWarrantWIP.xlsx | Bin 0 -> 11414 bytes .../templates/excel/deliveryNote.xlsx | Bin 11502 -> 11541 bytes .../templates/excel/materialRequisition.xlsx | Bin 17768 -> 19560 bytes .../hcy/common/dto/SystemAuthAdminDto.java | 1 + .../common/dto/order/RepairOrderAuditDto.java | 12 +- .../hcy/common/dto/order/RepairOrderDto.java | 2 + .../common/dto/result/UserLargeDataDto.java | 1 + .../common/entity/order/OrderPartCode.java | 3 +- .../entity/order/OrderSparePartUse.java | 1 + .../hcy/common/entity/order/RepairOrder.java | 2 +- .../common/entity/order/RepairOrderAudit.java | 11 + .../entity/order/RepairOrderStepData.java | 114 ++- .../common/entity/system/SystemAuthAdmin.java | 1 + .../java/com/hcy/common/entity/user/User.java | 1 + .../order/RepairOrderAuditStatusEnum.java | 5 +- .../enums/order/RepairOrderStatusEnum.java | 4 + .../mapper/order/OrderSparePartMapper.java | 4 +- .../mapper/order/RepairOrderAuditMapper.java | 4 +- .../mapper/order/RepairOrderMapper.java | 7 + .../resources/mapper/RepairOrderMapper.xml | 33 + .../order/RepairOrderController.java | 14 + .../front/service/impl/UserServiceImpl.java | 2 +- .../service/order/IRepairOrderService.java | 12 +- .../impl/MaintenanceOrderServiceImpl.java | 4 +- .../order/impl/RepairOrderServiceImpl.java | 901 ++++++++++++------ .../warehouse/impl/WarehouseServiceImpl.java | 27 +- .../validate/order/RepairOrderAuditParam.java | 12 + .../validate/order/RepairOrderParam.java | 11 + .../vo/order/OrderSparePartUseListVo.java | 2 +- .../front/vo/order/OrderSparePartUseVo.java | 1 + .../front/vo/order/OrderStatusCountVo.java | 2 + .../vo/order/RepairOrderAuditDetailVo.java | 12 + .../vo/order/RepairOrderAuditListVo.java | 12 + .../front/vo/order/RepairOrderDetailVo.java | 3 + .../hcy/front/vo/order/RepairOrderListVo.java | 1 + .../front/vo/order/RepairOrderStepDataVo.java | 1 + .../com/hcy/front/vo/user/UserCenterVo.java | 1 + 79 files changed, 2178 insertions(+), 506 deletions(-) create mode 100644 admin/src/main/java/com/hcy/admin/vo/excel/order/ClientCollarExcel.java create mode 100644 admin/src/main/java/com/hcy/admin/vo/excel/order/ClientCollerExcel.java create mode 100644 admin/src/main/java/com/hcy/admin/vo/excel/order/WarehouseWarrantWIPExcel.java create mode 100644 admin/src/main/resources/templates/excel/ClientCollar.xlsx create mode 100644 admin/src/main/resources/templates/excel/WarehouseWarrantWIP.xlsx diff --git a/admin/src/main/java/com/hcy/admin/controller/client/ClientController.java b/admin/src/main/java/com/hcy/admin/controller/client/ClientController.java index a11e28f..dc685d0 100644 --- a/admin/src/main/java/com/hcy/admin/controller/client/ClientController.java +++ b/admin/src/main/java/com/hcy/admin/controller/client/ClientController.java @@ -38,6 +38,7 @@ public class ClientController { PageResult list = iClientService.list(pageParam, params); return AjaxResult.success(list); } + /** * 客户详情 * diff --git a/admin/src/main/java/com/hcy/admin/controller/client/EquipmentController.java b/admin/src/main/java/com/hcy/admin/controller/client/EquipmentController.java index 2cf4935..b33599d 100644 --- a/admin/src/main/java/com/hcy/admin/controller/client/EquipmentController.java +++ b/admin/src/main/java/com/hcy/admin/controller/client/EquipmentController.java @@ -8,6 +8,7 @@ import com.hcy.admin.vo.client.EquipmentListVo; import com.hcy.admin.vo.client.EquipmentDetailVo; import com.hcy.common.core.AjaxResult; import com.hcy.common.core.PageResult; +import com.hcy.common.exception.OperateException; import com.hcy.common.utils.QRCodeUtil; import com.hcy.common.validator.annotation.IDMust; import org.springframework.validation.annotation.Validated; @@ -65,7 +66,8 @@ public class EquipmentController { @PostMapping("/add") public Object add(@Validated(value = EquipmentParam.create.class) @RequestBody EquipmentParam equipmentParam) { if (iEquipmentService.checkEquipmentNumberUnique(equipmentParam)) { - return AjaxResult.success(300,"","新增设备失败,设备编号已存在"); +// return AjaxResult.success(300,"","新增设备失败,设备编号已存在"); + throw new OperateException("新增设备失败,设备编号已存在!"); } iEquipmentService.add(equipmentParam); return AjaxResult.success(); @@ -82,7 +84,7 @@ public class EquipmentController { @PostMapping("/edit") public Object edit(@Validated(value = EquipmentParam.update.class) @RequestBody EquipmentParam equipmentParam) { if (iEquipmentService.checkEquipmentNumberUnique(equipmentParam)) { - return AjaxResult.success("修改设备失败,设备编号已存在"); + throw new OperateException("编辑设备失败,设备编号已存在!"); } iEquipmentService.edit(equipmentParam); return AjaxResult.success(); diff --git a/admin/src/main/java/com/hcy/admin/controller/order/ParentRepairOrderController.java b/admin/src/main/java/com/hcy/admin/controller/order/ParentRepairOrderController.java index 1a94695..4c90530 100644 --- a/admin/src/main/java/com/hcy/admin/controller/order/ParentRepairOrderController.java +++ b/admin/src/main/java/com/hcy/admin/controller/order/ParentRepairOrderController.java @@ -117,4 +117,18 @@ public class ParentRepairOrderController { public void exportExcel(@Validated @RequestBody ParentRepairOrderParam params, HttpServletResponse response) { iParentRepairOrderService.exportExcel(params,response); } + + @ApiOperation(value = "导出客户领机报表") + @PostMapping(value="/clientCollarExcel") + @ResponseBody + public void clientCollarExcel(HttpServletResponse response) { + iParentRepairOrderService.clientCollarExcel(response); + } + + @ApiOperation(value = "导出客户入库WIP表") + @PostMapping(value="/warehouseWarrantWIPExcel") + @ResponseBody + public void warehouseWarrantWIPExcel(HttpServletResponse response) { + iParentRepairOrderService.warehouseWarrantWIPExcel(response); + } } diff --git a/admin/src/main/java/com/hcy/admin/controller/order/RepairOrderAuditController.java b/admin/src/main/java/com/hcy/admin/controller/order/RepairOrderAuditController.java index 56f40c3..8887881 100644 --- a/admin/src/main/java/com/hcy/admin/controller/order/RepairOrderAuditController.java +++ b/admin/src/main/java/com/hcy/admin/controller/order/RepairOrderAuditController.java @@ -136,5 +136,15 @@ public class RepairOrderAuditController { return AjaxResult.success(); } - + /** + * 报废申请 - 质检 + * + * @author hcy + * @return Object + */ + @PostMapping("/qualityTesting") + public Object qualityTesting(@RequestBody RepairOrderAuditParam repairOrderAuditParam) { + iRepairOrderAuditService.qualityTesting(repairOrderAuditParam); + return AjaxResult.success(); + } } diff --git a/admin/src/main/java/com/hcy/admin/controller/order/RepairOrderController.java b/admin/src/main/java/com/hcy/admin/controller/order/RepairOrderController.java index 4afe607..3e23f4a 100644 --- a/admin/src/main/java/com/hcy/admin/controller/order/RepairOrderController.java +++ b/admin/src/main/java/com/hcy/admin/controller/order/RepairOrderController.java @@ -272,4 +272,17 @@ public class RepairOrderController { List list = iRepairOrderService.partsList(repairOrderParam); return AjaxResult.success(list); } + + /** + * 根据工单号和审核id查出使用配件列表 + * + * @author hcy + * @param repairOrderParam 搜索参数 + * @return Object + */ + @GetMapping("/partsUseList") + public Object partsUseList(RepairOrderParam repairOrderParam) { + List list = iRepairOrderService.partsUseList(repairOrderParam); + return AjaxResult.success(list); + } } diff --git a/admin/src/main/java/com/hcy/admin/controller/sparePart/SparePartController.java b/admin/src/main/java/com/hcy/admin/controller/sparePart/SparePartController.java index 7fe162f..b9351f0 100644 --- a/admin/src/main/java/com/hcy/admin/controller/sparePart/SparePartController.java +++ b/admin/src/main/java/com/hcy/admin/controller/sparePart/SparePartController.java @@ -109,4 +109,5 @@ public class SparePartController { PageResult list = iSparePartService.purchaseList(pageParam, params); return AjaxResult.success(list); } + } 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 62c34f9..7bbeb00 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 @@ -1,5 +1,6 @@ package com.hcy.admin.service.client.impl; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -21,6 +22,7 @@ import com.hcy.common.mapper.client.EquipmentMapper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import javax.annotation.Resource; @@ -136,10 +138,12 @@ public class ClientServiceImpl implements IClientService { * @param clientParam 参数 */ @Override + @Transactional 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()); Integer count = clientMapper.selectCount(queryWrapper); @@ -161,12 +165,9 @@ public class ClientServiceImpl implements IClientService { */ @Override public void edit(ClientParam clientParam) { - Long id = clientParam.getId(); - String clientNo = clientParam.getClientNo(); - Client model = clientMapper.selectOne( new QueryWrapper() - .eq("id", id) + .eq("id", clientParam.getId()) .eq("is_delete", GlobalConstant.NOT_DELETE) .last("limit 1")); @@ -174,13 +175,18 @@ public class ClientServiceImpl implements IClientService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(Client::getIsDelete, GlobalConstant.NOT_DELETE) - .ne(Client::getId,id) - .eq(Client::getPhone, clientParam.getPhone()) - .eq(Client::getClientNo,clientNo); + .eq(Client::getPhone, clientParam.getPhone()); + Client phone = clientMapper.selectOne(queryWrapper); + if (phone != null && !Objects.equals(phone.getId(), model.getId())) { + throw new OperateException("手机号码不可重复!"); + } - Integer count = clientMapper.selectCount(queryWrapper); - if(count > 0){ - throw new OperateException("客户编号或手机号码重复"); + LambdaQueryWrapper clientNoQueryWrapper = new LambdaQueryWrapper() + .eq(Client::getIsDelete, GlobalConstant.NOT_DELETE) + .eq(Client::getClientNo, clientParam.getClientNo()); + Client clientNo = clientMapper.selectOne(clientNoQueryWrapper); + if (clientNo != null && !Objects.equals(clientNo.getId(), model.getId())) { + throw new OperateException("客户编号不可重复!"); } BeanUtils.copyProperties(clientParam,model); diff --git a/admin/src/main/java/com/hcy/admin/service/client/impl/EquipmentServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/client/impl/EquipmentServiceImpl.java index 1fcd787..ee62e59 100644 --- a/admin/src/main/java/com/hcy/admin/service/client/impl/EquipmentServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/client/impl/EquipmentServiceImpl.java @@ -205,12 +205,12 @@ public class EquipmentServiceImpl implements IEquipmentService { model.setClientId(equipmentParam.getClientId()); model.setModuleId(equipmentParam.getModuleId()); model.setNumber(equipmentParam.getNumber()); - Integer count = equipmentMapper.selectCount(new LambdaQueryWrapper() - .eq(Equipment::getIsDelete, GlobalConstant.NOT_DELETE) - .eq(Equipment::getNumber, equipmentParam.getNumber())); - if(count > 0){ - throw new OperateException("设备编号不可重复!"); - } +// Integer count = equipmentMapper.selectCount(new LambdaQueryWrapper() +// .eq(Equipment::getIsDelete, GlobalConstant.NOT_DELETE) +// .eq(Equipment::getNumber, equipmentParam.getNumber())); +// if(count > 0){ +// throw new OperateException("设备编号不可重复!"); +// } model.setName(equipmentParam.getName()); model.setModel(equipmentParam.getModel()); model.setManufacturers(equipmentParam.getManufacturers()); @@ -370,11 +370,11 @@ public class EquipmentServiceImpl implements IEquipmentService { // 如果查询结果model为null,或者查询到的记录的ID等于bo.getId(), // 则表示number是唯一的,因此返回true。 if (ObjectUtil.isNull(model) || model.getId().equals(bo.getId())) { - return true; + return false; } // 否则,返回false表示number不唯一。 - return false; + return true; } /** diff --git a/admin/src/main/java/com/hcy/admin/service/order/IParentRepairOrderService.java b/admin/src/main/java/com/hcy/admin/service/order/IParentRepairOrderService.java index 3bd77c1..33a995c 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/IParentRepairOrderService.java +++ b/admin/src/main/java/com/hcy/admin/service/order/IParentRepairOrderService.java @@ -75,4 +75,16 @@ public interface IParentRepairOrderService { * @return */ void exportExcel(ParentRepairOrderParam params, HttpServletResponse response); + + /** + * 导出客户领机报表 + * @param response + */ + void clientCollarExcel(HttpServletResponse response); + + /** + * 导出客户入库WIP表 + * @param response + */ + void warehouseWarrantWIPExcel(HttpServletResponse response); } diff --git a/admin/src/main/java/com/hcy/admin/service/order/IRepairOrderAuditService.java b/admin/src/main/java/com/hcy/admin/service/order/IRepairOrderAuditService.java index e525923..12dd5b8 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/IRepairOrderAuditService.java +++ b/admin/src/main/java/com/hcy/admin/service/order/IRepairOrderAuditService.java @@ -74,4 +74,10 @@ public interface IRepairOrderAuditService { * 配货打印 */ void distributionPrinting(RepairOrderAuditParam repairOrderAuditParam); + + /** + * 质检 + * @param repairOrderAuditParam + */ + void qualityTesting(RepairOrderAuditParam repairOrderAuditParam); } diff --git a/admin/src/main/java/com/hcy/admin/service/order/IRepairOrderService.java b/admin/src/main/java/com/hcy/admin/service/order/IRepairOrderService.java index 46a4abf..c2bd875 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/IRepairOrderService.java +++ b/admin/src/main/java/com/hcy/admin/service/order/IRepairOrderService.java @@ -3,10 +3,7 @@ package com.hcy.admin.service.order; import com.hcy.admin.validate.common.PageParam; import com.hcy.admin.validate.order.RepairOrderParam; import com.hcy.admin.vo.excel.ModuleMaintenanceExcel; -import com.hcy.admin.vo.order.MaintenanceReportOrderListVo; -import com.hcy.admin.vo.order.OrderSparePartListVo; -import com.hcy.admin.vo.order.RepairOrderListVo; -import com.hcy.admin.vo.order.RepairOrderDetailVo; +import com.hcy.admin.vo.order.*; import com.hcy.common.core.PageResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; @@ -154,4 +151,12 @@ public interface IRepairOrderService { * @return */ List partsList(RepairOrderParam repairOrderParam); + + + /** + * 根据工单号和审核id查出使用配件列表 + * @param repairOrderParam + * @return + */ + List partsUseList(RepairOrderParam repairOrderParam); } 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 5565982..7ca6ef6 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 @@ -280,6 +280,15 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService { vo.setSparePartStockAuditDetailVo(sparePartStockAuditDetailVo); } + //全包工单报价为0,半包正常显示 actualAmount; // 实际金额 clientType; // 桩点维修类型 0-全包 1-半包 + Client clientType = clientMapper.findClientById(vo.getClientId()); + if(clientType != null){ + if(clientType.getClientType() == ClientStatusEnum.PLIE_POINT_ALL_WRAPPED.getStatus()){ + vo.setTotalAmount(BigDecimal.valueOf(0)); + vo.setActualAmount(BigDecimal.valueOf(0)); + } + } + //设置配件清单 List orderSpareParts = orderSparePartMapper.selectList(new LambdaQueryWrapper() .eq(OrderSparePart::getMaintenanceOrderId, model.getId())); @@ -291,6 +300,14 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService { if(warehouse != null){ orderSparePartListVo.setWarehouseName(warehouse.getWarehouseName()); } + orderSparePartListVo.setUnitPrice(String.valueOf(item.getUnitPrice())); // 单价 + //判断是否是全包客户,全包客户费用为0 + if(clientType != null){ + if(clientType.getClientType() == ClientStatusEnum.PLIE_POINT_ALL_WRAPPED.getStatus()){ + orderSparePartListVo.setTotalPrice(BigDecimal.valueOf(0)); + } + } + orderSparePartListVos.add(orderSparePartListVo); } vo.setSparePartList(orderSparePartListVos); @@ -316,18 +333,10 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService { //设置订单操作记录 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(OrderOperateRecord::getOrderType, OrderOperateRecordEnum.MAINTENANCE.getStatus()) - .eq(OrderOperateRecord::getOrderId, model.getId()); + .eq(OrderOperateRecord::getOrderId, model.getId()) + .orderByDesc(OrderOperateRecord::getCreateTime); vo.setOrderOperateRecords(orderOperateRecordMapper.selectList(queryWrapper));; - //全包工单报价为0,半包正常显示 actualAmount; // 实际金额 clientType; // 桩点维修类型 0-全包 1-半包 - Client clientType = clientMapper.findClientById(vo.getClientId()); - if(clientType != null){ - if(clientType.getClientType() == ClientStatusEnum.PLIE_POINT_ALL_WRAPPED.getStatus()){ - vo.setTotalAmount(BigDecimal.valueOf(0)); - vo.setActualAmount(BigDecimal.valueOf(0)); - } - } - //配件领用状态 SparePartStockAudit receiverStatus = sparePartStockAuditMapper.selectOne(new LambdaQueryWrapper() .eq(SparePartStockAudit::getOrderId, model.getId()) 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 0ab6ecb..10ae633 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 @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.query.MPJQueryWrapper; +import com.hcy.admin.AdminThreadLocal; import com.hcy.admin.service.order.IParentRepairOrderService; import com.hcy.admin.validate.common.PageParam; import com.hcy.admin.validate.order.ParentRepairOrderParam; @@ -37,15 +37,9 @@ import com.hcy.common.mapper.setting.DictDataMapper; 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.utils.ArrayUtil; import com.hcy.common.utils.StringUtil; import com.hcy.common.utils.TimeUtil; -import com.hcy.common.utils.UrlUtil; -import com.hcy.common.config.GlobalConfig; -import com.hcy.common.utils.excel.EasyExcelUtil; import com.hcy.common.utils.excel.LocalImageModifyStrategy; -import org.apache.poi.ss.formula.functions.T; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.BeanUtils; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; @@ -54,10 +48,10 @@ import org.springframework.util.Assert; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.InputStream; +import java.math.BigDecimal; import java.net.URL; +import java.text.DecimalFormat; import java.util.*; import java.util.stream.Collectors; @@ -418,12 +412,15 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { //报废单 List scrapFormList = new ArrayList<>(); int index3 = 1; - //报废单 + //难修改派单 退仓单 List beyondRepairOrderList = new ArrayList<>(); int index4 = 1; //领机单 List machineClaimNoteList = new ArrayList<>(); int index5 = 1; + //维修工序单 + List clientCollarExcelList = new ArrayList<>(); + int index6 = 1; for (ParentRepairOrder parentRepairOrder : parentRepairOrders) { List repairOrderList = repairOrderMapper.findRepairOrderByParentId(parentRepairOrder.getId()); @@ -433,10 +430,15 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { // if(contentAdmin != null){ // offerDetail.setCreator(contentAdmin.getUsername()); // } + //设置客户信息 Client client = clientMapper.findClientById(parentRepairOrder.getClientId()); + //客户配件采购因子 + BigDecimal purchaseDivisor = null; + if(client != null){ offerDetail.setClientName(client.getClientName()); + purchaseDivisor = client.getPurchaseDivisor(); // 配件采购价格因子 } //获取工单编号 offerDetail.setOrderNo(parentRepairOrder.getOrderNo()); @@ -514,11 +516,17 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { //单位数据获取配件表数据 SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() .eq(SparePart::getId, orderSparePartDto.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; if(sparePart != null){ getMaterialsOrder.setUnit(sparePart.getUnit()); + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + getMaterialsOrder.setUnitPrice(df1.format(unitPrice)); } - index1++; getMaterialsOrderList.add(getMaterialsOrder); offerDetail.setTotalQty(offerDetail.getTotalQty() + orderSparePartDto.getCount()); @@ -578,7 +586,9 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { //返回维修前照片 RepairOrderStepData preMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(preMaintenanceImg != null){ try{ List imgList1 = new ArrayList<>(); @@ -597,7 +607,9 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { //返回维修中照片 RepairOrderStepData inMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(inMaintenanceImg != null){ try{ List imgList1 = new ArrayList<>(); @@ -615,7 +627,9 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { //返回维修后照片 RepairOrderStepData afterRepairImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(afterRepairImg != null){ try{ List imgList1 = new ArrayList<>(); @@ -634,21 +648,43 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { /* 更换明细 replacementDetail 更换损坏器件明细 - (格式:维修主板:物料位号 * 配件编码 * 配件名称 * 规格型号 * 更换数量) + (格式:维修主板:物料位号 * 配件编码 * 配件名称 * 规格型号 * 更换数量 * 配件单价) PFC:C1 * CST9830-001 * 螺母 * 30A500V * 1 1、获取配件清单 */ - List orderSparePartUses = orderSparePartUseMapper.selectList(new LambdaQueryWrapper() - .eq(OrderSparePartUse::getRepairOrderId, item.getId())); + +// List orderSparePartUses = orderSparePartUseMapper.selectList(new LambdaQueryWrapper() +// .eq(OrderSparePartUse::getRepairOrderId, item.getId()) +// .eq(repairOrderAudit != null , OrderSparePartUse::getRepairOrderAuditId, repairOrderAudit.getId()) +// ); + List orderSparePartUses = new ArrayList<>(); + if(repairOrderAudit != null){ + orderSparePartUses = orderSparePartUseMapper.selectList(new LambdaQueryWrapper() + .eq(OrderSparePartUse::getRepairOrderId, item.getId()) + .eq(repairOrderAudit != null , OrderSparePartUse::getRepairOrderAuditId, repairOrderAudit.getId()) + ); + } + if(orderSparePartUses != null){ StringBuilder sb = new StringBuilder(); for (OrderSparePartUse orderSparePartUs : orderSparePartUses) { if (sb.length() > 0) { sb.append("\n"); } + //获取当前配件单价 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePartUs.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + sb.append(orderSparePartUs.getRepairMotherboard()).append(":").append(orderSparePartUs.getMaterialPositionNumber()).append(" * ") .append(orderSparePartUs.getSparePartsCode()).append(" * ").append(orderSparePartUs.getSparePartsName()).append(" * ") - .append(orderSparePartUs.getSpecificationsModel()).append(" * ").append(orderSparePartUs.getUseNumber()); + .append(orderSparePartUs.getSpecificationsModel()).append(" * ").append(orderSparePartUs.getUseNumber()).append(" * ") + .append(df1.format(unitPrice)); } // 将数据转换为指定格式的字符串 String detail = sb.toString(); @@ -719,7 +755,21 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { if(operationsSuggest != null){ scrapForm.setOperationsSuggest(operationsSuggest.getName()); } - scrapForm.setCreator(offerDetail.getCreator()); + //审核人 + SystemAuthAdmin creator = systemAuthAdminMapper.selectOne(new LambdaQueryWrapper() + .eq(SystemAuthAdmin::getId, repairOrderAudit.getAuditorId()) + .eq(SystemAuthAdmin::getIsDelete, GlobalConstant.NOT_DELETE)); + if(creator != null){ + scrapForm.setCreator(creator.getUsername()); + } + //确认人 + SystemAuthAdmin qualityTestingName = systemAuthAdminMapper.selectOne(new LambdaQueryWrapper() + .eq(SystemAuthAdmin::getId, repairOrderAudit.getQualityTestingId()) // 质检人id + .eq(SystemAuthAdmin::getIsDelete, GlobalConstant.NOT_DELETE)); + if(qualityTestingName != null){ + scrapForm.setQualityTestingName(qualityTestingName.getUsername()); + } + scrapForm.setDeliveryTime(TimeUtil.dateToString(parentRepairOrder.getCreateTime(), TimeConstant.DATE_FORMAT)); scrapFormList.add(scrapForm); index3++; @@ -733,75 +783,68 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { if(repairOrderAuditsList.isEmpty()){ continue; } - for (RepairOrderAudit RepairOrderAudit : repairOrderAuditsList) { - BeyondRepairOrder beyondRepairOrder = new BeyondRepairOrder(); - beyondRepairOrder.setIndex(index4); //序号 - beyondRepairOrder.setOrderNo(parentRepairOrder.getOrderNo()); //单据编号 - beyondRepairOrder.setSpecificationsModel(item.getModuleNumber()); //型号/规格 - beyondRepairOrder.setModelCode(item.getModuleCode()); //模块代码 - beyondRepairOrder.setPower(distMap.get(item.getModulePower().toString())); //功率 - - if(item.getRepairOrNot() != null){ - beyondRepairOrder.setIsRepair(item.getRepairOrNot() == 0 ? "是" : "否"); //是否返修 - } - - String maintenanceManName = null; - - if(item.getPreviousMaintenanceStaffId() != null){ - SystemAuthAdmin maintenanceMan = systemAuthAdminMapper.findSystemAuthAdminById(Math.toIntExact(item.getPreviousMaintenanceStaffId())); - if(maintenanceMan != null){ - maintenanceManName = "原:" + maintenanceMan.getUsername(); //原维修人员 - } - } - if(item.getReceiverId() != null){ - SystemAuthAdmin maintenanceMan = systemAuthAdminMapper.findSystemAuthAdminById(Math.toIntExact(item.getReceiverId())); - if(maintenanceMan != null){ - if(maintenanceManName != null){ - maintenanceManName = maintenanceManName + "\n现:" + maintenanceMan.getUsername(); - }else{ - maintenanceManName = "现:" + maintenanceMan.getUsername(); //维修人员 - } - } - } - beyondRepairOrder.setMaintenanceMan(maintenanceManName); - - //退仓原因 - beyondRepairOrder.setReasonForWithdrawal(RepairOrderAudit.getReasonForWithdrawal()); // 退仓原因 - - - /* - 更换明细 replacementDetail - 更换损坏器件明细 - (格式:维修主板:物料位号 * 配件编码 * 配件名称 * 规格型号 * 更换数量) - PFC:C1 * CST9830-001 * 螺母 * 30A500V * 1 - 1、获取配件清单 - */ - List orderSparePartUses = orderSparePartUseMapper.selectList(new LambdaQueryWrapper() - .eq(OrderSparePartUse::getRepairOrderId, item.getId())); - if(orderSparePartUses != null){ - StringBuilder sb = new StringBuilder(); - for (OrderSparePartUse orderSparePartUs : orderSparePartUses) { - if (sb.length() > 0) { - sb.append("\n"); - } - sb.append(orderSparePartUs.getRepairMotherboard()).append(":").append(orderSparePartUs.getMaterialPositionNumber()).append(" * ") - .append(orderSparePartUs.getSparePartsCode()).append(" * ").append(orderSparePartUs.getSparePartsName()).append(" * ") - .append(orderSparePartUs.getSpecificationsModel()).append(" * ").append(orderSparePartUs.getUseNumber()); - } - // 将数据转换为指定格式的字符串 - String detail = sb.toString(); - beyondRepairOrder.setReplacementDetail(detail); - } - beyondRepairOrder.setCreator(offerDetail.getCreator()); //制单人 - beyondRepairOrder.setDeliveryTime(TimeUtil.dateToString(parentRepairOrder.getCreateTime(), TimeConstant.DATE_FORMAT)); //制单日期 - - beyondRepairOrderList.add(beyondRepairOrder); - index4++; + BeyondRepairOrder beyondRepairOrder = new BeyondRepairOrder(); + beyondRepairOrder.setIndex(index4); //序号 + beyondRepairOrder.setOrderNo(parentRepairOrder.getOrderNo()); //单据编号 + beyondRepairOrder.setSpecificationsModel(item.getModuleNumber()); //型号/规格 + beyondRepairOrder.setModelCode(item.getModuleCode()); //模块代码 + beyondRepairOrder.setPower(distMap.get(item.getModulePower().toString())); //功率 + if(item.getRepairOrNot() != null){ + beyondRepairOrder.setIsRepair(item.getRepairOrNot() == 0 ? "是" : "否"); //是否返修 } + SystemAuthAdmin systemAuthAdmin = new SystemAuthAdmin(); + if(item.getReceiverId() != null){ + systemAuthAdmin = systemAuthAdminMapper.findSystemAuthAdminById(Math.toIntExact(item.getReceiverId())); + } + + String yuan = ""; + String reasonForWithdrawal = ""; + + for (RepairOrderAudit repairOrderAudit : repairOrderAuditsList) { + //获取维修人员 + User userById = userMapper.findUserById(repairOrderAudit.getApplicantId()); + if(userById != null){ + yuan = yuan + userById.getUsername() + ","; + } + + //难修原因 + reasonForWithdrawal = reasonForWithdrawal + "(" + userById.getUsername() + ")\n" + "维修了什么?\n1、" + repairOrderAudit.getWhatWasRepairedOne() + "\n2、" + + repairOrderAudit.getWhatWasRepairedTwo() + "\n3、" + repairOrderAudit.getWhatWasRepairedThree() + "\n现在遇到了什么问题?\n1、" + + repairOrderAudit.getQuestionOne() + "\n2、" + repairOrderAudit.getQuestionTwo() + "\n3、" + repairOrderAudit.getQuestionThree() + "\n"; + + + } + //删除维修人员最后一个逗号 + if(yuan != null && yuan != ""){ + yuan= yuan.substring(0,yuan.length() -1); + } + + //维修人员 + if(StringUtil.isEmpty(yuan)){ + beyondRepairOrder.setMaintenanceMan("现:"+systemAuthAdmin.getUsername()); + }else{ + if(systemAuthAdmin.getUsername() != null){ + if(yuan.equals(systemAuthAdmin.getUsername())){ + beyondRepairOrder.setMaintenanceMan("现:"+systemAuthAdmin.getUsername()); + }else { + beyondRepairOrder.setMaintenanceMan("原:" + yuan + "\n现:"+systemAuthAdmin.getUsername()); + } + }else{ + beyondRepairOrder.setMaintenanceMan("原:" + yuan); + } + } + + beyondRepairOrder.setReasonForWithdrawal(reasonForWithdrawal); // 退仓原因 + beyondRepairOrder.setCreator(offerDetail.getCreator()); //制单人 + beyondRepairOrder.setDeliveryTime(TimeUtil.dateToString(parentRepairOrder.getCreateTime(), TimeConstant.DATE_FORMAT)); //制单日期 + + beyondRepairOrderList.add(beyondRepairOrder); + index4++; } if(ids.equals("5")){ //5-领机单 MachineClaimNote machineClaimNote = new MachineClaimNote(); + machineClaimNote.setOrderNo(parentRepairOrder.getOrderNo()); //单据编号 machineClaimNote.setIndex(index5); //序号 machineClaimNote.setSpecificationsModel(item.getModuleNumber()); //型号/规格 machineClaimNote.setModelCode(item.getModuleCode()); //模块代码 @@ -830,11 +873,75 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { machineClaimNoteList.add(machineClaimNote); index5++; } + if(ids.equals("6")){ + //6-维修工序单 + ClientCollarExcel clientCollarExcel = new ClientCollarExcel(); + clientCollarExcel.setOrderNo(parentRepairOrder.getOrderNo()); //工单编号 + clientCollarExcel.setIndex(index6); //序号 + clientCollarExcel.setSpecificationsModel(item.getModuleNumber()); //型号/规格 + clientCollarExcel.setModelCode(item.getModuleCode()); //模块代码 + clientCollarExcel.setPower(distMap.get(item.getModulePower().toString())); //功率 + if(item.getScrapOrNot() != null){ //排查结果 + clientCollarExcel.setScrapOrNot(item.getScrapOrNot() == 0 ? "报废" : "维修"); + } + + //设置客户信息 + Client clientName = clientMapper.findClientById(item.getClientId()); + if(clientName != null){ + clientCollarExcel.setClientName(client.getClientName()); + } + + // 维修人员 + if(item.getReceiverId() != null){ + SystemAuthAdmin maintenanceMan = systemAuthAdminMapper.findSystemAuthAdminById(Math.toIntExact(item.getReceiverId())); + if(maintenanceMan != null){ + clientCollarExcel.setMaintenanceMan(maintenanceMan.getUsername()); + } + } + + //拆机图片 setDismantle + clientCollarExcel.setDismantle(imgExcel(item.getId(), RepairOrderStopEnum.DISMANTLE.getStatus())); + //除尘 dedusting + clientCollarExcel.setDedusting(imgExcel(item.getId(), RepairOrderStopEnum.DEDUSTING.getStatus())); + //功能测试 functionalTestImg + clientCollarExcel.setFunctionalTestImg(imgExcel(item.getId(), RepairOrderStopEnum.FUNCTIONAL_TEST.getStatus())); + //DC&PFC组装 assembleImg + clientCollarExcel.setAssembleImg(imgExcel(item.getId(), RepairOrderStopEnum.DC_AND_PFC_ASSEMBLE.getStatus())); + //补强三防漆和点胶 reinforcingThreeAntiPaintAndDispensing + clientCollarExcel.setReinforcingThreeAntiPaintAndDispensing(imgExcel(item.getId(), RepairOrderStopEnum.REINFORCING_THREE_ANTI_PAINT_AND_DISPENSING.getStatus())); + //模块装配 moduleAssembly + clientCollarExcel.setModuleAssembly(imgExcel(item.getId(), RepairOrderStopEnum.MODULE_ASSEMBLY.getStatus())); + //老化测试 agingTest + clientCollarExcel.setAgingTest(imgExcel(item.getId(), RepairOrderStopEnum.AGING_TEST.getStatus())); + //报废图片 scrapPicture + RepairOrderAudit scrapRepairOrderAudit = repairOrderAuditMapper.findRepairOrderAuditByRepairOrderIdAndReviewRequest(item.getId(),3L); + if(scrapRepairOrderAudit != null){ + try{ + List imgList1 = new ArrayList<>(); + String[] arr = scrapRepairOrderAudit.getScrapImg().split(",");// 报废图片 + for (String s : arr) { + imgList1.add(new URL(s)); + } + clientCollarExcel.setScrapPicture(imgList1); + }catch (Exception e) { + System.out.println("导出异常"); + } + } + //返回维修前照片 + clientCollarExcel.setRepairFront(imgExcel(item.getId(), RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus())); + //返回维修中照片 + clientCollarExcel.setRepairIng(imgExcel(item.getId(), RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus())); + //返回维修后照片 + clientCollarExcel.setRepairBack(imgExcel(item.getId(), RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus())); + + clientCollarExcelList.add(clientCollarExcel); + index6++; + } } } } - for (int i = 0; i < 7; i++) { + for (int i = 0; i < 8; i++) { WriteSheet sheet = EasyExcel.writerSheet(i).build(); switch (i){ case 0: @@ -864,6 +971,10 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { writer.fill(offerDetail, sheet); writer.fill(machineClaimNoteList, fillConfig, sheet); break; + case 6: + writer.fill(offerDetail, sheet); + writer.fill(clientCollarExcelList, fillConfig, sheet); + break; } } @@ -877,4 +988,227 @@ public class ParentRepairOrderServiceImpl implements IParentRepairOrderService { } + /** + * 查询步骤图片 + * @param repairOrderId + * @param repairStep + * @return + */ + public List imgExcel(Long repairOrderId, Integer repairStep){ + RepairOrderStepData dismantle = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() + .eq(RepairOrderStepData::getRepairOrderId, repairOrderId) + .eq(RepairOrderStepData::getRepairStep, repairStep) + .eq(RepairOrderStepData::getIsDelete, GlobalConstant.NOT_DELETE) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); + if(dismantle != null){ + try{ + List imgList = new ArrayList<>(); + String[] arr = dismantle.getImg().split(","); + for (String s : arr) { + imgList.add(new URL(s)); + } + return imgList; + }catch (Exception e) { + System.out.println("导出异常"); + } + } + return null; + } + + /** + * 导出客户领机报表 + * + * @param response + */ + @Override + public void clientCollarExcel(HttpServletResponse response) { + try { + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(ParentRepairOrder::getIsDelete, GlobalConstant.NOT_DELETE); + //查询待导出的维修单 + List parentRepairOrders = parentRepairOrderMapper.selectList(lambdaQueryWrapper); + + // 文件模板输入流,将 excel 模板放到 resources 目录下 + InputStream templateFile = new ClassPathResource("templates/excel/ClientCollar.xlsx").getInputStream(); + + //功率字典 + Map distMap = dictDataMapper.selectList(new LambdaQueryWrapper() + .eq(DictData::getIsDelete, GlobalConstant.NOT_DELETE) + .eq(DictData::getTypeId, 46)) + .stream() + .collect(Collectors.toMap(DictData::getValue, DictData::getName)); + + ServletOutputStream out = response.getOutputStream(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build(); + //设置多sheet输出流 + ExcelWriter writer = EasyExcel + .write(out) + .withTemplate(templateFile) + // 使用图片处理策略 + .registerWriteHandler( + // 设置每张图片的宽度为 100px,转换因子为 32 + new LocalImageModifyStrategy(100, 32)) + .build(); + //公共数据 + OfferDetailEntity offerDetail = new OfferDetailEntity(); + //客户领机单 + List clientCollerExcelList = new ArrayList<>(); + int index = 1; + + for (ParentRepairOrder parentRepairOrder : parentRepairOrders) { + List repairOrderList = repairOrderMapper.findRepairOrderByParentId(parentRepairOrder.getId()); + + //获取制单时间 + offerDetail.setDeliveryTime(TimeUtil.dateToString(new Date(), TimeConstant.DATE_FORMAT)); + + //获取制单人 + SystemAuthAdmin contentAdmin = systemAuthAdminMapper.findSystemAuthAdminById(AdminThreadLocal.getAdminId()); + if(contentAdmin != null){ + offerDetail.setCreator(contentAdmin.getUsername()); + } + + for (RepairOrder item : repairOrderList) { + //5-领机单 + ClientCollerExcel machineClaimNote = new ClientCollerExcel(); + //客户名称 + Client client = clientMapper.findClientById(parentRepairOrder.getClientId()); + if(client != null){ + machineClaimNote.setClientName(client.getClientName()); + } + + machineClaimNote.setOrderNo(parentRepairOrder.getOrderNo()); //单据编号 + machineClaimNote.setIndex(index); //序号 + machineClaimNote.setSpecificationsModel(item.getModuleNumber()); //型号/规格 + machineClaimNote.setModelCode(item.getModuleCode()); //模块代码 + machineClaimNote.setPower(distMap.get(item.getModulePower().toString())); //功率 + + if(item.getRepairOrNot() != null){ + machineClaimNote.setIsRepair(item.getRepairOrNot() == 0 ? "是" : "否"); //是否返修 + } + + if(item.getReceiverId() != null){ + SystemAuthAdmin maintenanceMan = systemAuthAdminMapper.findSystemAuthAdminById(Math.toIntExact(item.getReceiverId())); + if(maintenanceMan != null){ + machineClaimNote.setMaintenanceMan(maintenanceMan.getUsername()); //维修人员 + } + }else{ + machineClaimNote.setMaintenanceMan("未派单"); //没有维修人员就是还没有派单 + } + + clientCollerExcelList.add(machineClaimNote); + index++; + + + } + } + + WriteSheet sheet = EasyExcel.writerSheet(0).build(); + + offerDetail.setTotalQty(index == 1 ? 0 : index - 1); + writer.fill(offerDetail, sheet); + writer.fill(clientCollerExcelList, fillConfig, sheet); + + + writer.finish(); + out.close(); + templateFile.close(); + }catch (Exception e){ + e.printStackTrace(); + throw new OperateException("导出报表出现错误:"+e.getLocalizedMessage()); + } + } + + /** + * 导出客户入库WIP表 + * + * @param response + */ + @Override + public void warehouseWarrantWIPExcel(HttpServletResponse response) { + try { + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(ParentRepairOrder::getIsDelete, GlobalConstant.NOT_DELETE); + //查询待导出的维修单 + List parentRepairOrders = parentRepairOrderMapper.selectList(lambdaQueryWrapper); + + // 文件模板输入流,将 excel 模板放到 resources 目录下 + InputStream templateFile = new ClassPathResource("templates/excel/WarehouseWarrantWIP.xlsx").getInputStream(); + + //功率字典 + Map distMap = dictDataMapper.selectList(new LambdaQueryWrapper() + .eq(DictData::getIsDelete, GlobalConstant.NOT_DELETE) + .eq(DictData::getTypeId, 46)) + .stream() + .collect(Collectors.toMap(DictData::getValue, DictData::getName)); + + ServletOutputStream out = response.getOutputStream(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build(); + //设置多sheet输出流 + ExcelWriter writer = EasyExcel + .write(out) + .withTemplate(templateFile) + // 使用图片处理策略 + .registerWriteHandler( + // 设置每张图片的宽度为 100px,转换因子为 32 + new LocalImageModifyStrategy(100, 32)) + .build(); + //公共数据 + OfferDetailEntity offerDetail = new OfferDetailEntity(); + //客户入库WIP单 + List warehouseWarrantWIPExcelList = new ArrayList<>(); + int index = 1; + + for (ParentRepairOrder parentRepairOrder : parentRepairOrders) { + List repairOrderList = repairOrderMapper.findRepairOrderByParentId(parentRepairOrder.getId()); + + for (RepairOrder item : repairOrderList) { + //入库WIP表 + WarehouseWarrantWIPExcel warehouseWarrantWIPExcel = new WarehouseWarrantWIPExcel(); + //客户名称 + Client client = clientMapper.findClientById(parentRepairOrder.getClientId()); + if(client != null){ + warehouseWarrantWIPExcel.setClientName(client.getClientName()); + } + warehouseWarrantWIPExcel.setOrderNo(parentRepairOrder.getOrderNo()); //单据编号 + warehouseWarrantWIPExcel.setIndex(index); //序号 + warehouseWarrantWIPExcel.setWarehousingDate(TimeUtil.dateToString(item.getCreateTime(), TimeConstant.DATE_FORMAT)); // 入库日期 + warehouseWarrantWIPExcel.setSpecificationsModel(item.getModuleNumber()); //型号/规格 + warehouseWarrantWIPExcel.setModelCode(item.getModuleCode()); //模块代码 + warehouseWarrantWIPExcel.setPower(distMap.get(item.getModulePower().toString())); //功率 + if(item.getRepairOrNot() != null){ + warehouseWarrantWIPExcel.setIsRepair(item.getRepairOrNot() == 0 ? "是" : "否"); //是否返修 + } +// if(item.getReceiverId() != null){ +// SystemAuthAdmin maintenanceMan = systemAuthAdminMapper.findSystemAuthAdminById(Math.toIntExact(item.getReceiverId())); +// if(maintenanceMan != null){ +// warehouseWarrantWIPExcel.setMaintenanceMan(maintenanceMan.getUsername()); //维修人员 +// } +// }else{ +// warehouseWarrantWIPExcel.setMaintenanceMan("未派单"); //没有维修人员就是还没有派单 +// } + + warehouseWarrantWIPExcelList.add(warehouseWarrantWIPExcel); + index++; + } + } + + WriteSheet sheet = EasyExcel.writerSheet(0).build(); + + offerDetail.setTotalQty(index == 1 ? 0 : index - 1); + writer.fill(offerDetail, sheet); + writer.fill(warehouseWarrantWIPExcelList, fillConfig, sheet); + + + writer.finish(); + out.close(); + templateFile.close(); + }catch (Exception e){ + e.printStackTrace(); + throw new OperateException("导出报表出现错误:"+e.getLocalizedMessage()); + } + } + } 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 921cdf5..e6bbbf7 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 @@ -11,6 +11,7 @@ import com.hcy.admin.service.order.IRepairOrderAuditService; import com.hcy.admin.validate.common.PageParam; import com.hcy.admin.validate.order.RepairOrderAuditParam; import com.hcy.admin.vo.order.*; +import com.hcy.common.constant.GlobalConstant; import com.hcy.common.constant.TimeConstant; import com.hcy.common.core.PageResult; import com.hcy.common.dto.order.OrderSparePart; @@ -34,11 +35,14 @@ import com.hcy.common.mapper.user.UserMapper; import com.hcy.common.mapper.warehouse.WarehouseMapper; import com.hcy.common.plugin.notice.engine.SmsNotice; import com.hcy.common.utils.TimeUtil; +import org.apache.xmlbeans.impl.common.GlobalLock; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.text.DecimalFormat; import java.util.*; /** @@ -159,10 +163,14 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { .eq(ParentRepairOrder::getId, repairOrder.getParentRepairOrderId())); vo.setOrderNo(parentRepairOrder.getOrderNo()); + //客户配件采购因子 + BigDecimal purchaseDivisor = null; //客户名称 Client client = clientMapper.selectOne(new LambdaQueryWrapper() .eq(Client::getId, repairOrder.getClientId())); vo.setClientName(client.getClientName()); + purchaseDivisor = client.getPurchaseDivisor(); // 配件采购价格因子 + //模块型号、模块代码 vo.setModuleCode(repairOrder.getModuleCode()); @@ -173,16 +181,28 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { .eq(User::getId, model.getApplicantId())); vo.setApplicantName(user.getUsername()); - //配件领料备注 + //故障排查 - 配件领料备注 RepairOrderStepData repairOrderStepData = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, model.getRepairOrderId()) .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.TROUBLESHOOTING.getStatus()) + .or() + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.RECOLLAR_FITTING.getStatus()) .orderByDesc(RepairOrderStepData::getCreateTime) .last("limit 1"));//故障排查 if(repairOrderStepData != null){ vo.setReceiveRemark(repairOrderStepData.getRemark()); } + //重领配件备注 recollarFittingRemark + RepairOrderStepData recollarFittingRemark = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() + .eq(RepairOrderStepData::getRepairOrderId, model.getRepairOrderId()) + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.RECOLLAR_FITTING.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1"));//故障排查 + if(recollarFittingRemark != null){ + vo.setRecollarFittingRemark(recollarFittingRemark.getRemark()); + } + //配件领用数据 Integer number = 0; //领用数量 @@ -199,13 +219,26 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { .eq(Warehouse::getId, orderSparePart.getWarehouseId())); orderSparePartListVo.setWarehouseName(warehouse.getWarehouseName()); + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePart.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + orderSparePartListVo.setUnitPrice(df1.format(unitPrice)); + orderSparePartListVoList.add(orderSparePartListVo); number += orderSparePart.getCount(); } }else{ orderSparePartList = orderSparePartMapper.selectList(new LambdaQueryWrapper() - .eq(OrderSparePart::getRepairOrderId, model.getRepairOrderId())); + .eq(OrderSparePart::getRepairOrderId, model.getRepairOrderId()) + .eq(OrderSparePart::getIsDelete, GlobalConstant.NOT_DELETE)); + for (OrderSparePart orderSparePart : orderSparePartList) { OrderSparePartListVo orderSparePartListVo = new OrderSparePartListVo(); BeanUtils.copyProperties(orderSparePart, orderSparePartListVo); @@ -215,6 +248,17 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { .eq(Warehouse::getId, orderSparePart.getWarehouseId())); orderSparePartListVo.setWarehouseName(warehouse.getWarehouseName()); + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePart.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + orderSparePartListVo.setUnitPrice(df1.format(unitPrice)); + orderSparePartListVoList.add(orderSparePartListVo); number += orderSparePart.getCount(); @@ -281,28 +325,36 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { //返回维修前照片 RepairOrderStepData preMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, model.getRepairOrderId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(preMaintenanceImg != null){ vo.setPreMaintenanceImg(preMaintenanceImg.getImg()); } //返回维修中照片 RepairOrderStepData inMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, model.getRepairOrderId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(inMaintenanceImg != null){ vo.setInMaintenanceImg(inMaintenanceImg.getImg()); } //返回维修后照片 RepairOrderStepData afterRepairImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, model.getRepairOrderId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(afterRepairImg != null){ vo.setAfterRepairImg(afterRepairImg.getImg()); } //返回良品入库照片 RepairOrderStepData img = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, model.getRepairOrderId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.GOOD_PRODUCTS_ARE_STORED.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.GOOD_PRODUCTS_ARE_STORED.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(img != null){ vo.setImg(img.getImg()); vo.setEnterRemark(img.getRemark()); @@ -312,10 +364,23 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { List orderSparePartUseListVoList = new ArrayList<>(); List sparePartUseParamsList = orderSparePartUseMapper.selectList(new LambdaQueryWrapper() .eq(OrderSparePartUse::getRepairOrderId, model.getRepairOrderId()) + .eq(OrderSparePartUse::getRepairOrderAuditId, model.getId()) .eq(OrderSparePartUse::getReviewRequest, RepairOrderAuditStatusEnum.GOOD_PRODUCTS_ARE_STORED.getStatus())); for (OrderSparePartUse orderSparePartUse : sparePartUseParamsList) { OrderSparePartUseVo orderSparePartUsetListVo = new OrderSparePartUseVo(); BeanUtils.copyProperties(orderSparePartUse, orderSparePartUsetListVo); + + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePartUse.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + orderSparePartUsetListVo.setUnitPrice(df1.format(unitPrice)); + orderSparePartUseListVoList.add(orderSparePartUsetListVo); } vo.setSparePartUseParams(orderSparePartUseListVoList); //配件使用列表 @@ -324,10 +389,23 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { List replaceDamagedPartsListVoList = new ArrayList<>(); List replaceDamagedParts = orderSparePartUseMapper.selectList(new LambdaQueryWrapper() .eq(OrderSparePartUse::getRepairOrderId, model.getRepairOrderId()) + .eq(OrderSparePartUse::getRepairOrderAuditId, model.getId()) .eq(OrderSparePartUse::getReviewRequest, RepairOrderAuditStatusEnum.CANCELLATION_REQUEST.getStatus())); for (OrderSparePartUse orderSparePartUse : replaceDamagedParts) { OrderSparePartUseVo orderSparePartUsetListVo = new OrderSparePartUseVo(); BeanUtils.copyProperties(orderSparePartUse, orderSparePartUsetListVo); + + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePartUse.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + orderSparePartUsetListVo.setUnitPrice(df1.format(unitPrice)); + replaceDamagedPartsListVoList.add(orderSparePartUsetListVo); } vo.setReplaceDamagedParts(replaceDamagedPartsListVoList); //更换损坏配件清单 @@ -342,6 +420,23 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { vo.setWithdrawalImg(withdrawalImg.getImg()); } + //退仓原因 + String reasonForWithdrawal = null; // 退仓原因 + reasonForWithdrawal = "维修了什么?\n1、" + model.getWhatWasRepairedOne() + "\n2、" + + model.getWhatWasRepairedTwo() + "\n3、" + model.getWhatWasRepairedThree() + "\n现在遇到了什么问题?\n1、" + + model.getQuestionOne() + "\n2、" + model.getQuestionTwo() + "\n3、" + model.getQuestionThree(); + vo.setReasonForWithdrawal(reasonForWithdrawal); + + //取消原因 reasonOfCancellation; // 取消原因 + RepairOrderStepData reasonOfCancellation = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() + .eq(RepairOrderStepData::getRepairOrderId, model.getRepairOrderId()) + .eq(RepairOrderStepData::getTitle, "配件领料已取消") + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); + if(reasonOfCancellation != null){ + vo.setReasonOfCancellation(reasonOfCancellation.getRemark()); + } + return vo; } @@ -487,9 +582,19 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { vo.setApplicantName(applicantName.getUsername()); } + //1、先获取维修模块单 + RepairOrder repairOrder1 = repairOrderMapper.selectOne(new LambdaQueryWrapper() + .eq(RepairOrder::getId, item.getRepairOrderId()) + .eq(RepairOrder::getIsDelete, GlobalConstant.NOT_DELETE)); + //客户配件采购因子 + BigDecimal purchaseDivisor = null; + //客户名称 + Client client = clientMapper.selectOne(new LambdaQueryWrapper() + .eq(Client::getId, repairOrder1.getClientId())); + purchaseDivisor = client.getPurchaseDivisor(); // 配件采购价格因子 + //配件领用数据 Integer number = 0; //领用数量 - List orderSparePartListVoList = new ArrayList<>(); List orderSparePartList = orderSparePartMapper.findOrderSparePartByRepairOrderIdAndRepairOrderAuditId( item.getRepairOrderId(),item.getId()); @@ -499,6 +604,17 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { orderSparePartListVoList.add(orderSparePartListVo); number += orderSparePart.getCount(); + + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePartListVo.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + orderSparePartListVo.setUnitPrice(df1.format(unitPrice)); } vo.setOrderSparePartListVoList(orderSparePartListVoList); //订单配件 @@ -535,6 +651,12 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { vo.setWithdrawalImg(repairOrderStepData.getImg());// 退仓申请图片 } + //退仓原因 + String reasonForWithdrawal = null; // 退仓原因 + reasonForWithdrawal = "维修了什么?\n1、" + item.getWhatWasRepairedOne() + "\n2、" + + item.getWhatWasRepairedTwo() + "\n3、" + item.getWhatWasRepairedThree() + "\n现在遇到了什么问题?\n1、" + + item.getQuestionOne() + "\n2、" + item.getQuestionTwo() + "\n3、" + item.getQuestionThree(); + vo.setReasonForWithdrawal(reasonForWithdrawal); } list.add(vo); @@ -542,6 +664,7 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); } + /** * 审核 * @@ -568,8 +691,9 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { if(model.getReviewRequest() == RepairOrderAuditStatusEnum.APPLICATION_FOR_SCRAP.getStatus()){ //报废申请审核 if(repairOrderAuditParam.getAuditResult() == RepairOrderAuditStatusEnum.ALREADY_PASSED.getStatus()){ - //已通过,审核状态为:待入库 - model.setAuditStatus(RepairOrderAuditStatusEnum.STOCK_PENDING.getStatus());// 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认) + // 已通过,审核状态为:待质检 + // 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认、6=已取消、7=待质检、8=质检不通过) + model.setAuditStatus(RepairOrderAuditStatusEnum.WAIT_FOR_QUALITY_INSPECTION.getStatus()); //新增维修单操作记录 RepairOrderStepData repairOrderStepData = new RepairOrderStepData(); @@ -583,11 +707,18 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { } else if (repairOrderAuditParam.getAuditResult() == RepairOrderAuditStatusEnum.NOT_PASS.getStatus()) { //未通过,审核状态为:审核未通过 model.setAuditStatus(RepairOrderAuditStatusEnum.FAIL_THE_AUDIT.getStatus());// 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认) + //报废申请不通过-工单步骤回到故障排查 + //1、先获取维修模块单 + repairOrder.setRepairNextStep(RepairOrderStopEnum.TROUBLESHOOTING.getStatus()); // 下个步骤 + repairOrder.setOrderStatus(RepairOrderStatusEnum.UNDER_INVESTIGATION.getStatus()); // 工单状态为2、排查中 + repairOrder.setScrapOrNot(null); // 是否报废(0=是,1=否) + repairOrderMapper.updateById(repairOrder); + //新增维修单操作记录 RepairOrderStepData repairOrderStepData = new RepairOrderStepData(); repairOrderStepData.setRepairOrderId(model.getRepairOrderId());// 维修单id repairOrderStepData.setRemark("管理员【"+AdminThreadLocal.get("username")+"】完成审核,审核结果:不通过,审核意见:"+repairOrderAuditParam.getAuditOpinion());// 备注 - repairOrderStepData.setTitle("管理员进行审核"); // 标题 + repairOrderStepData.setTitle("管理员进行报废申请审核"); // 标题 repairOrderStepData.setAuditStatus(AuditStateEnum.NOT_PASS_STATE.getStatus()); //审核不通过 repairOrderStepData.setCreatorId(Long.valueOf(AdminThreadLocal.getAdminId())); //创建人 repairOrderStepData.setCreateTime(new Date()); // 创建时间 @@ -597,7 +728,9 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { // 领料申请审核 if(repairOrderAuditParam.getAuditResult() == RepairOrderAuditStatusEnum.NOT_PASS.getStatus()){ //配件领用审核不通过 -// RepairOrder repairOrder = repairOrderMapper.findRepairOrderById(model.getRepairOrderId()); + //未通过,审核状态为:审核未通过 + model.setAuditStatus(RepairOrderAuditStatusEnum.FAIL_THE_AUDIT.getStatus());// 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认) + if(repairOrder != null){ repairOrder.setReturnCause(repairOrderAuditParam.getAuditOpinion()); repairOrder.setRepairNextStep(RepairOrderStopEnum.RECOLLAR_FITTING.getStatus());//维修单审核不通过步骤为重领配件 @@ -609,7 +742,7 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { RepairOrderStepData repairOrderStepData = new RepairOrderStepData(); repairOrderStepData.setRepairOrderId(model.getRepairOrderId());// 维修单id repairOrderStepData.setRemark("管理员【"+AdminThreadLocal.get("username")+"】完成审核,审核结果:不通过,审核意见:"+repairOrderAuditParam.getAuditOpinion());// 备注 - repairOrderStepData.setTitle("管理员进行审核"); // 标题 + repairOrderStepData.setTitle("管理员进行领料申请审核"); // 标题 repairOrderStepData.setAuditStatus(AuditStateEnum.NOT_PASS_STATE.getStatus()); //审核不通过 repairOrderStepData.setCreatorId(Long.valueOf(AdminThreadLocal.getAdminId())); //创建人 repairOrderStepData.setCreateTime(new Date()); // 创建时间 @@ -638,7 +771,6 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { .last("limit 1")); // 出库时需要判断库存数量是否大于出库数量,大于才允许出库;反之,提示备件库存数量不足 if (sparePart.getQuantity() >= orderSparePart.getCount()) { - /*model.setAuditState(AuditStateEnum.UNREVIEWED.getStatus());*/ sparePart.setQuantity(sparePart.getQuantity() - orderSparePart.getCount()); } else { throw new OperateException("备件库存数量不足,请联系客服人员!"); @@ -676,6 +808,12 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { //未通过,审核状态为:审核未通过 model.setAuditStatus(RepairOrderAuditStatusEnum.FAIL_THE_AUDIT.getStatus());// 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认) + //良品入库申请不通过-工单步骤回到上传维修前 + //1、先获取维修模块单信息 + repairOrder.setRepairNextStep(RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus()); // 下个步骤 + repairOrder.setOrderStatus(RepairOrderStatusEnum.IN_MAINTENANCE.getStatus()); // 工单状态为 4、维修中 + repairOrderMapper.updateById(repairOrder); + //新增维修单操作记录 RepairOrderStepData repairOrderStepData = new RepairOrderStepData(); repairOrderStepData.setRepairOrderId(model.getRepairOrderId());// 维修单id @@ -707,6 +845,12 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { model.setAuditStatus(RepairOrderAuditStatusEnum.FAIL_THE_AUDIT.getStatus());// 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认) //申请退仓,是否在退仓中(0=是,1=否) repairOrder.setReturning(RepairOrderStatusEnum.NO.getStatus()); + + //如果当前步骤是确认签名,下一个步骤就是重领配件 + if(repairOrder.getRepairNextStep() == RepairOrderStopEnum.CONFIRMATION_SIGNATURE.getStatus()){ + repairOrder.setRepairNextStep(RepairOrderStopEnum.RECOLLAR_FITTING.getStatus());// 当前步骤为重领配件 + } + repairOrderMapper.updateById(repairOrder); //新增维修单操作记录 @@ -753,4 +897,70 @@ public class RepairOrderAuditServiceImpl implements IRepairOrderAuditService { } } + /** + * 质检 + * + * @param repairOrderAuditParam + */ + @Override + public void qualityTesting(RepairOrderAuditParam repairOrderAuditParam) { + RepairOrderAudit model = repairOrderAuditMapper.selectOne( + new QueryWrapper() + .eq("id", repairOrderAuditParam.getId()) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + model.setQualityTestingResult(repairOrderAuditParam.getQualityTestingResult()); // 质检结果(0=通过,1=不通过) + model.setQualityTestingId(Long.valueOf(AdminThreadLocal.getAdminId())); // 质检人 + model.setQualityTestingTime(new Date());// 质检时间 + model.setQualityTestingOpinion(repairOrderAuditParam.getQualityTestingOpinion()); // 质检意见 + model.setQualityTestingImg(repairOrderAuditParam.getQualityTestingImg()); // 质检图片 + + if(repairOrderAuditParam.getQualityTestingResult() == RepairOrderAuditStatusEnum.ALREADY_PASSED.getStatus()){ + // 已通过,审核状态为:待入库 + // 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认、6=已取消、7=待质检、8=质检不通过) + model.setAuditStatus(RepairOrderAuditStatusEnum.STOCK_PENDING.getStatus()); + + //新增维修单操作记录 + RepairOrderStepData repairOrderStepData = new RepairOrderStepData(); + repairOrderStepData.setRepairOrderId(model.getRepairOrderId());// 维修单id + repairOrderStepData.setImg(repairOrderAuditParam.getQualityTestingImg()); // 质检图片 + repairOrderStepData.setRemark("管理员【"+AdminThreadLocal.get("username")+"】完成质检,质检通过");// 备注 + repairOrderStepData.setTitle("管理员进行报废申请质检"); // 标题 + repairOrderStepData.setAuditStatus(AuditStateEnum.ALREADY_PASSED.getStatus()); //审核通过 + repairOrderStepData.setCreatorId(Long.valueOf(AdminThreadLocal.getAdminId())); //创建人 + repairOrderStepData.setCreateTime(new Date()); // 创建时间 + repairOrderStepDataMapper.insert(repairOrderStepData); + + } else if (repairOrderAuditParam.getQualityTestingResult() == RepairOrderAuditStatusEnum.NOT_PASS.getStatus()) { + // 未通过,审核状态为:质检不通过 + // 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认、6=已取消、7=待质检、8=质检不通过) + model.setAuditStatus(RepairOrderAuditStatusEnum.FAILURE_OF_QUALITY_INSPECTION.getStatus()); + //报废申请不通过-工单步骤回到故障排查 + //1、先获取维修模块单 + RepairOrder repairOrder1 = repairOrderMapper.selectOne(new LambdaQueryWrapper() + .eq(RepairOrder::getId, model.getRepairOrderId()) + .eq(RepairOrder::getIsDelete, GlobalConstant.NOT_DELETE)); + repairOrder1.setRepairNextStep(RepairOrderStopEnum.TROUBLESHOOTING.getStatus()); // 下个步骤 + repairOrder1.setOrderStatus(RepairOrderStatusEnum.UNDER_INVESTIGATION.getStatus()); // 工单状态为2、排查中 + repairOrder1.setScrapOrNot(null); // 是否报废(0=是,1=否) + repairOrderMapper.updateById(repairOrder1); + + //新增维修单操作记录 + RepairOrderStepData repairOrderStepData = new RepairOrderStepData(); + repairOrderStepData.setRepairOrderId(model.getRepairOrderId());// 维修单id + repairOrderStepData.setImg(repairOrderAuditParam.getQualityTestingImg()); // 质检图片 + repairOrderStepData.setRemark("管理员【"+AdminThreadLocal.get("username")+"】完成质检,质检结果:不通过,质检意见:"+repairOrderAuditParam.getQualityTestingOpinion()); + repairOrderStepData.setTitle("管理员进行报废申请质检"); // 标题 + repairOrderStepData.setAuditStatus(AuditStateEnum.NOT_PASS_STATE.getStatus()); //审核不通过 + repairOrderStepData.setCreatorId(Long.valueOf(AdminThreadLocal.getAdminId())); //创建人 + repairOrderStepData.setCreateTime(new Date()); // 创建时间 + repairOrderStepDataMapper.insert(repairOrderStepData); + } + + repairOrderAuditMapper.updateById(model); + } + } diff --git a/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderServiceImpl.java index 1c6f733..3990355 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderServiceImpl.java @@ -85,6 +85,7 @@ import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URL; import java.net.URLEncoder; +import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -234,28 +235,36 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //返回维修前照片 RepairOrderStepData preMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(preMaintenanceImg != null){ vo.setPreMaintenanceImg(preMaintenanceImg.getImg()); } //返回维修中照片 RepairOrderStepData inMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(inMaintenanceImg != null){ vo.setInMaintenanceImg(inMaintenanceImg.getImg()); } //返回维修后照片 RepairOrderStepData afterRepairImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(afterRepairImg != null){ vo.setAfterRepairImg(afterRepairImg.getImg()); } //返回故障点照片 faultPointImg; // 故障点照片 RepairOrderStepData troubleshooting = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.TROUBLESHOOTING.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.TROUBLESHOOTING.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(troubleshooting != null){ vo.setFaultPointImg(troubleshooting.getImg()); } @@ -293,7 +302,9 @@ public class RepairOrderServiceImpl implements IRepairOrderService { if(model.getOrderStatus() == RepairOrderStatusEnum.FINISHED.getStatus()){ RepairOrderStepData stepData = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, model.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.GOOD_PRODUCTS_ARE_STORED.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.GOOD_PRODUCTS_ARE_STORED.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(stepData != null){ vo.setImg(stepData.getImg()); vo.setEnterRemark(stepData.getRemark()); @@ -305,6 +316,8 @@ public class RepairOrderServiceImpl implements IRepairOrderService { ParentRepairOrder parentRepairOrder = parentRepairOrderMapper.selectOne(new LambdaQueryWrapper() .eq(ParentRepairOrder::getId, model.getParentRepairOrderId())); vo.setOrderNo(parentRepairOrder.getOrderNo()); + //客户配件采购因子 + BigDecimal purchaseDivisor = null; //客户名称 负责人 联系电话 Client clientName = clientMapper.selectOne( @@ -315,6 +328,7 @@ public class RepairOrderServiceImpl implements IRepairOrderService { vo.setDirector(clientName.getDirector()); vo.setPhone(clientName.getPhone()); vo.setMaintainType(clientName.getMaintainType()); + purchaseDivisor = clientName.getPurchaseDivisor(); // 配件采购价格因子 } //创建人名称 User creatorName = userMapper.selectOne( @@ -391,7 +405,8 @@ public class RepairOrderServiceImpl implements IRepairOrderService { } //设置配件清单 List orderSpareParts = orderSparePartMapper.selectList(new LambdaQueryWrapper() - .eq(OrderSparePart::getRepairOrderId, model.getId())); + .eq(OrderSparePart::getRepairOrderId, model.getId()) + .eq(OrderSparePart::getIsDelete, GlobalConstant.NOT_DELETE)); List orderSparePartListVos = new ArrayList<>(); for (OrderSparePart item : orderSpareParts) { OrderSparePartListVo orderSparePartListVo = new OrderSparePartListVo(); @@ -400,6 +415,18 @@ public class RepairOrderServiceImpl implements IRepairOrderService { Warehouse warehouse = warehouseMapper.selectOne(new LambdaQueryWrapper() .eq(Warehouse::getId, item.getWarehouseId())); orderSparePartListVo.setWarehouseName(warehouse.getWarehouseName()); + + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, item.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + orderSparePartListVo.setUnitPrice(df1.format(unitPrice)); + orderSparePartListVos.add(orderSparePartListVo); } vo.setSparePartList(orderSparePartListVos); @@ -477,21 +504,27 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //返回维修前照片 RepairOrderStepData preMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, model.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(preMaintenanceImg != null){ vo.setPreMaintenanceImg(preMaintenanceImg.getImg()); } //返回维修中照片 RepairOrderStepData inMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, model.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(inMaintenanceImg != null){ vo.setInMaintenanceImg(inMaintenanceImg.getImg()); } //返回维修后照片 RepairOrderStepData afterRepairImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, model.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(afterRepairImg != null){ vo.setAfterRepairImg(afterRepairImg.getImg()); } @@ -507,7 +540,8 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //配件编码 List orderPartCodes = orderPartCodeMapper.selectList(new LambdaQueryWrapper() - .eq(OrderPartCode::getRepairOrderId, vo.getId())); + .eq(OrderPartCode::getRepairOrderId, vo.getId()) + .eq(OrderPartCode::getIsDelete, GlobalConstant.NOT_DELETE)); if(orderPartCodes != null){ vo.setOrderPartCodeList(orderPartCodes); } @@ -554,7 +588,11 @@ public class RepairOrderServiceImpl implements IRepairOrderService { // 维修信息 RepairOrderAudit repairOrderAudit1 = repairOrderAuditMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderAudit::getRepairOrderId, model.getId()) - .in(RepairOrderAudit::getReviewRequest, Arrays.asList(RepairOrderAuditStatusEnum.GOOD_PRODUCTS_ARE_STORED.getStatus(),RepairOrderAuditStatusEnum.FILL_IN_MAINTENANCE_INFORMATION.getStatus()))); + .in(RepairOrderAudit::getReviewRequest, Arrays.asList(RepairOrderAuditStatusEnum.GOOD_PRODUCTS_ARE_STORED.getStatus(), + RepairOrderAuditStatusEnum.FILL_IN_MAINTENANCE_INFORMATION.getStatus())) + .eq(RepairOrderAudit::getIsDelete, GlobalConstant.NOT_DELETE) + .orderByDesc(RepairOrderAudit::getCreateTime) + .last("limit 1")); if(repairOrderAudit1 != null){ RepairOrderAuditListVo repairOrderAuditListVo = new RepairOrderAuditListVo(); BeanUtils.copyProperties(repairOrderAudit1,repairOrderAuditListVo); @@ -593,6 +631,18 @@ public class RepairOrderServiceImpl implements IRepairOrderService { for (OrderSparePartUse orderSparePartUs : orderSparePartUses) { OrderSparePartUseVo ospUserVo = new OrderSparePartUseVo(); BeanUtils.copyProperties(orderSparePartUs,ospUserVo); + + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePartUs.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + ospUserVo.setUnitPrice(df1.format(unitPrice)); + ospUserVoList.add(ospUserVo); } repairOrderAuditListVo.setPartsUseList(ospUserVoList); @@ -620,6 +670,18 @@ public class RepairOrderServiceImpl implements IRepairOrderService { for (OrderSparePartUse orderSparePartUs : orderSparePartUses) { OrderSparePartUseVo ospUserVo = new OrderSparePartUseVo(); BeanUtils.copyProperties(orderSparePartUs,ospUserVo); + + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePartUs.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + ospUserVo.setUnitPrice(df1.format(unitPrice)); + ospUserVoList.add(ospUserVo); } repairOrderAuditListVo.setPartsUseList(ospUserVoList); @@ -1129,11 +1191,14 @@ public class RepairOrderServiceImpl implements IRepairOrderService { .eq(SystemAuthAdmin::getId, repairOrderParam.getReceiverId())); //第一次派单维修人员为空,就将第一次派单的人给原维修人员,第二次就获取第一次的维修员为原维修人员 - if(repairOrder.getReceiverId() == null){ + if(repairOrder.getReceiverId() == null && repairOrder.getPreviousMaintenanceStaffId() == null){ repairOrder.setPreviousMaintenanceStaffId(repairOrderParam.getReceiverId()); // 原维修人员id - }else{ + }else if(repairOrder.getPreviousMaintenanceStaffId() == null){ repairOrder.setPreviousMaintenanceStaffId(repairOrder.getReceiverId()); } +// else{ +// repairOrder.setPreviousMaintenanceStaffId(repairOrder.getReceiverId()); +// } repairOrder.setReceiverId(repairOrderParam.getReceiverId()); // 接单人id repairOrder.setReceiverTime(new Date());//receiverTime; // 接单时间 @@ -1452,21 +1517,27 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //返回维修前照片 RepairOrderStepData preMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(preMaintenanceImg != null){ vo.setRepairFront(preMaintenanceImg.getImg()); } //返回维修中照片 RepairOrderStepData inMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(inMaintenanceImg != null){ vo.setRepairIng(inMaintenanceImg.getImg()); } //返回维修后照片 RepairOrderStepData afterRepairImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(afterRepairImg != null){ vo.setRepairBack(afterRepairImg.getImg()); } @@ -1592,6 +1663,7 @@ public class RepairOrderServiceImpl implements IRepairOrderService { repairOrderDto.setMaintenanceResult(RepairOrderStatusEnum.OK.getStatus()); List repairOrderDtoList = repairOrderMapper.maintenanceReportExcel(repairOrderDto); + for(RepairOrderDto item : repairOrderDtoList) { NormalMaintenanceExcel vo = new NormalMaintenanceExcel(); BeanUtils.copyProperties(item, vo); @@ -1627,7 +1699,9 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //返回维修前照片 RepairOrderStepData preMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(preMaintenanceImg != null){ try{ List imgList1 = new ArrayList<>(); @@ -1646,7 +1720,9 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //返回维修中照片 RepairOrderStepData inMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(inMaintenanceImg != null){ try{ List imgList1 = new ArrayList<>(); @@ -1664,7 +1740,9 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //返回维修后照片 RepairOrderStepData afterRepairImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(afterRepairImg != null){ try{ List imgList1 = new ArrayList<>(); @@ -1680,6 +1758,14 @@ public class RepairOrderServiceImpl implements IRepairOrderService { } } + //设置客户信息 + Client client = clientMapper.findClientById(item.getClientId()); + //客户配件采购因子 + BigDecimal purchaseDivisor = null; + if(client != null){ + purchaseDivisor = client.getPurchaseDivisor(); // 配件采购价格因子 + } + /* 更换明细 replacementDetail 更换损坏器件明细 @@ -1695,9 +1781,19 @@ public class RepairOrderServiceImpl implements IRepairOrderService { if (sb.length() > 0) { sb.append(";"); } + //获取当前配件单价 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePartUs.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } sb.append(orderSparePartUs.getRepairMotherboard()).append(":").append(orderSparePartUs.getMaterialPositionNumber()).append(" * ") .append(orderSparePartUs.getSparePartsCode()).append(" * ").append(orderSparePartUs.getSparePartsName()).append(" * ") - .append(orderSparePartUs.getSpecificationsModel()).append(" * ").append(orderSparePartUs.getUseNumber()); + .append(orderSparePartUs.getSpecificationsModel()).append(" * ").append(orderSparePartUs.getUseNumber()).append(" * ") + .append(df1.format(unitPrice)); } // 将数据转换为指定格式的字符串 String detail = sb.toString(); @@ -1752,7 +1848,9 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //返回维修前照片 RepairOrderStepData preMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.PRE_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(preMaintenanceImg != null){ try{ List imgList1 = new ArrayList<>(); @@ -1771,7 +1869,9 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //返回维修中照片 RepairOrderStepData inMaintenanceImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.IN_MAINTENANCE_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(inMaintenanceImg != null){ try{ List imgList1 = new ArrayList<>(); @@ -1789,7 +1889,9 @@ public class RepairOrderServiceImpl implements IRepairOrderService { //返回维修后照片 RepairOrderStepData afterRepairImg = repairOrderStepDataMapper.selectOne(new LambdaQueryWrapper() .eq(RepairOrderStepData::getRepairOrderId, item.getId()) - .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus())); + .eq(RepairOrderStepData::getRepairStep, RepairOrderStopEnum.AFTER_REPAIR_IMG.getStatus()) + .orderByDesc(RepairOrderStepData::getCreateTime) + .last("limit 1")); if(afterRepairImg != null){ try{ List imgList1 = new ArrayList<>(); @@ -1804,7 +1906,13 @@ public class RepairOrderServiceImpl implements IRepairOrderService { System.out.println("导出异常"); } } - +//设置客户信息 + Client client = clientMapper.findClientById(item.getClientId()); + //客户配件采购因子 + BigDecimal purchaseDivisor = null; + if(client != null){ + purchaseDivisor = client.getPurchaseDivisor(); // 配件采购价格因子 + } /* 更换明细 replacementDetail 更换损坏器件明细 @@ -1820,9 +1928,19 @@ public class RepairOrderServiceImpl implements IRepairOrderService { if (sb.length() > 0) { sb.append(";"); } + //获取当前配件单价 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, orderSparePartUs.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } sb.append(orderSparePartUs.getRepairMotherboard()).append(":").append(orderSparePartUs.getMaterialPositionNumber()).append(" * ") .append(orderSparePartUs.getSparePartsCode()).append(" * ").append(orderSparePartUs.getSparePartsName()).append(" * ") - .append(orderSparePartUs.getSpecificationsModel()).append(" * ").append(orderSparePartUs.getUseNumber()); + .append(orderSparePartUs.getSpecificationsModel()).append(" * ").append(orderSparePartUs.getUseNumber()).append(" * ") + .append(df1.format(unitPrice)); } // 将数据转换为指定格式的字符串 String detail = sb.toString(); @@ -2000,6 +2118,17 @@ public class RepairOrderServiceImpl implements IRepairOrderService { .eq(OrderSparePart::getRepairOrderAuditId, repairOrderParam.getRepairOrderAuditId()) .eq(OrderSparePart::getIsDelete, GlobalConstant.NOT_DELETE)); + //客户配件采购因子 + BigDecimal purchaseDivisor = null; + //维修工单信息 + RepairOrder repairOrder = repairOrderMapper.selectOne(new LambdaQueryWrapper() + .eq(RepairOrder::getId, repairOrderParam.getId())); + //客户信息 + Client client = clientMapper.selectOne(new LambdaQueryWrapper() + .eq(Client::getId, repairOrder.getClientId())); + purchaseDivisor = client.getPurchaseDivisor(); // 配件采购价格因子 + + List orderSparePartListVos = new ArrayList<>(); for (OrderSparePart item : orderSpareParts) { OrderSparePartListVo orderSparePartListVo = new OrderSparePartListVo(); @@ -2008,10 +2137,68 @@ public class RepairOrderServiceImpl implements IRepairOrderService { Warehouse warehouse = warehouseMapper.selectOne(new LambdaQueryWrapper() .eq(Warehouse::getId, item.getWarehouseId())); orderSparePartListVo.setWarehouseName(warehouse.getWarehouseName()); + + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, item.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + orderSparePartListVo.setUnitPrice(df1.format(unitPrice)); + orderSparePartListVos.add(orderSparePartListVo); } return orderSparePartListVos; } + /** + * 根据工单号和审核id查出使用配件列表 + * + * @param repairOrderParam + * @return + */ + @Override + public List partsUseList(RepairOrderParam repairOrderParam) { + //根据工单号和审核id查出配件列表 + List orderSparePartsUse = orderSparePartUseMapper.selectList(new LambdaQueryWrapper() + .eq(OrderSparePartUse::getRepairOrderId, repairOrderParam.getId()) + .eq(OrderSparePartUse::getRepairOrderAuditId, repairOrderParam.getRepairOrderAuditId()) + .eq(OrderSparePartUse::getIsDelete, GlobalConstant.NOT_DELETE)); + + //客户配件采购因子 + BigDecimal purchaseDivisor = null; + //维修工单信息 + RepairOrder repairOrder = repairOrderMapper.selectOne(new LambdaQueryWrapper() + .eq(RepairOrder::getId, repairOrderParam.getId())); + //客户信息 + Client client = clientMapper.selectOne(new LambdaQueryWrapper() + .eq(Client::getId, repairOrder.getClientId())); + purchaseDivisor = client.getPurchaseDivisor(); // 配件采购价格因子 + + + List orderSparePartUseListVos = new ArrayList<>(); + for (OrderSparePartUse item : orderSparePartsUse) { + OrderSparePartUseListVo orderSparePartUseListVo = new OrderSparePartUseListVo(); + BeanUtils.copyProperties(item, orderSparePartUseListVo); + //单位数据获取配件表数据 + SparePart sparePart = sparePartMapper.selectOne(new LambdaQueryWrapper() + .eq(SparePart::getId, item.getSparePartsId())); + //配件单价 = 客户采购价格因子 * 配件单价 + DecimalFormat df1 = new DecimalFormat("0.00"); + BigDecimal unitPrice = null; + if(purchaseDivisor != null && sparePart.getUnitPrice() != null){ + unitPrice = sparePart.getUnitPrice().multiply(purchaseDivisor); + } + orderSparePartUseListVo.setUnitPrice(df1.format(unitPrice)); + + orderSparePartUseListVos.add(orderSparePartUseListVo); + } + + return orderSparePartUseListVos; + } + } diff --git a/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderShippingServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderShippingServiceImpl.java index eb0086e..06ce64b 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderShippingServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderShippingServiceImpl.java @@ -570,6 +570,7 @@ public class RepairOrderShippingServiceImpl implements IRepairOrderShippingServi releaseRecordListExcel.getRemarkMap().put(RepairOrderStatusEnum.EMPTY.getDesc() ,releaseRecordListExcel.getRemarkMap().get(RepairOrderStatusEnum.EMPTY.getDesc()) == null ? 1 : releaseRecordListExcel.getRemarkMap().get(RepairOrderStatusEnum.EMPTY.getDesc()) + 1); } + StringBuilder builder = new StringBuilder(); for (String flag : releaseRecordListExcel.getRemarkMap().keySet()) { if(RepairOrderStatusEnum.SCRAP.getDesc().equals(flag)){ diff --git a/admin/src/main/java/com/hcy/admin/service/sparePart/impl/SparePartServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/sparePart/impl/SparePartServiceImpl.java index 9ab11ea..f3d89eb 100644 --- a/admin/src/main/java/com/hcy/admin/service/sparePart/impl/SparePartServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/sparePart/impl/SparePartServiceImpl.java @@ -303,7 +303,8 @@ public class SparePartServiceImpl implements ISparePartService { queryWrapper.or(); queryWrapper.like("spare_parts_name", pageDto.getLikeWork()); } - + //出库和调拨,选配件的时候,库存数量为0的不应出现 查询要加个字段 + queryWrapper.ne("quantity", 0); queryWrapper.eq("is_delete", 0); queryWrapper.orderByDesc("id"); @@ -352,11 +353,11 @@ public class SparePartServiceImpl implements ISparePartService { //出库和调拨,选配件的时候,库存数量为0的不应出现 查询要加个字段 String s = params.get("outAllotType"); - if(s != null && s.equals("0") && item.getQuantity() == 0){ - System.out.println("出库和调拨时,库存数量为0的不应出现!!!"); - }else{ +// if(s != null && s.equals("0") && item.getQuantity() == 0){ +// System.out.println("出库和调拨时,库存数量为0的不应出现!!!"); +// }else{ list.add(vo); - } +// } } 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 900ecce..f8e8858 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 @@ -466,6 +466,7 @@ public class SparePartStockAuditServiceImpl implements ISparePartStockAuditServi sparePartAudit.setStockAuditId(model.getId()); sparePartAudit.setSparePartsId(sparePart.getId()); sparePartAudit.setCount(item.getCount()); + sparePartAudit.setUnitPrice(item.getUnitPrice()); // 单价 sparePartAuditMapper.insert(sparePartAudit);//插入备件审核信息 } } 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 1389324..3d50fbc 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 @@ -290,6 +290,7 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { vo.setProvince(regionMap.get(sysAdmin.getProvinceId())); vo.setCity(regionMap.get(sysAdmin.getCityId())); vo.setDistrict(regionMap.get(sysAdmin.getDistrictId())); + vo.setGoodSkill(sysAdmin.getGoodSkill());//goodSkill; //擅长技能 return vo; } @@ -344,6 +345,7 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { user.setLastLoginTime(System.currentTimeMillis() / 1000); // 最后登录时间 user.setCreateTime(System.currentTimeMillis() / 1000); // 最后登录时间 user.setMobile(systemAuthAdminParam.getPhone()); // 用户电话 + user.setGoodSkill(systemAuthAdminParam.getGoodSkill()); //擅长技能 userMapper.insert(user); model.setUserId(user.getId().longValue()); } @@ -371,6 +373,7 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { model.setEmail(systemAuthAdminParam.getEmail()); model.setTechnicalGrade(systemAuthAdminParam.getTechnicalGrade()); model.setIsApprentice(systemAuthAdminParam.getIsApprentice()); + model.setGoodSkill(systemAuthAdminParam.getGoodSkill()); systemAuthAdminMapper.insert(model); //获取管理员id Long adminId = model.getId().longValue(); @@ -477,6 +480,7 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { user.setLastLoginTime(System.currentTimeMillis() / 1000); user.setCreateTime(System.currentTimeMillis() / 1000); user.setMobile(systemAuthAdminParam.getPhone()); + user.setGoodSkill(systemAuthAdminParam.getGoodSkill()); userMapper.insert(user); systemAuthAdmin.setUserId(user.getId().longValue()); }else if(!systemAuthAdminParam.getPhone().equals(systemAuthAdmin.getPhone())){ @@ -491,11 +495,13 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { User user = userMapper.selectById(systemAuthAdmin.getUserId()); user.setPassword(pwd);// 用户密码 user.setSalt(salt);// 加密盐巴 + user.setGoodSkill(systemAuthAdminParam.getGoodSkill()); userMapper.updateById(user); } systemAuthAdmin.setUpdateTime(System.currentTimeMillis() / 1000); + systemAuthAdmin.setGoodSkill(systemAuthAdminParam.getGoodSkill()); systemAuthAdminMapper.updateById(systemAuthAdmin); this.cacheAdminUserByUid(systemAuthAdminParam.getId()); @@ -536,6 +542,7 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { model.setAvatar(avatar); model.setNickname(systemAuthAdminParam.getNickname()); model.setUpdateTime(System.currentTimeMillis() / 1000); + model.setGoodSkill(systemAuthAdminParam.getGoodSkill()); if (systemAuthAdminParam.getPassword() != null && !systemAuthAdminParam.getPassword().equals("")) { String currPassword = ToolsUtil.makeMd5(systemAuthAdminParam.getCurrPassword() + model.getSalt()); diff --git a/admin/src/main/java/com/hcy/admin/service/warehouse/impl/WarehouseServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/warehouse/impl/WarehouseServiceImpl.java index 18e44e1..6f98773 100644 --- a/admin/src/main/java/com/hcy/admin/service/warehouse/impl/WarehouseServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/warehouse/impl/WarehouseServiceImpl.java @@ -166,22 +166,24 @@ public class WarehouseServiceImpl implements IWarehouseService { .in("id", ids)); for (Long id : ids) { //仓库存在配件且配件数量不为0时,不允许删除 - SparePart sparePart = sparePartMapper.selectOne( + List sparePartList = sparePartMapper.selectList( new QueryWrapper() .eq("warehouse_id", id) + .eq("is_delete", 0)); + + for (SparePart sparePart : sparePartList) { + if(sparePart.getQuantity() != 0){ + throw new OperateException("仓库存在配件且配件数量不为0时,不允许删除!"); + } + } + + Warehouse pModel = warehouseMapper.selectOne( + new QueryWrapper() + .select("id,pid,warehouse_name") + .eq("pid", id) .eq("is_delete", 0) .last("limit 1")); - if(sparePart != null && sparePart.getQuantity() != 0){ - - }else{ - Warehouse pModel = warehouseMapper.selectOne( - new QueryWrapper() - .select("id,pid,warehouse_name") - .eq("pid", id) - .eq("is_delete", 0) - .last("limit 1")); - Assert.isNull(pModel, "请先删除子级仓库"); - } + Assert.isNull(pModel, "请先删除子级仓库"); } diff --git a/admin/src/main/java/com/hcy/admin/validate/client/ClientParam.java b/admin/src/main/java/com/hcy/admin/validate/client/ClientParam.java index f1c7a4b..4af31ee 100644 --- a/admin/src/main/java/com/hcy/admin/validate/client/ClientParam.java +++ b/admin/src/main/java/com/hcy/admin/validate/client/ClientParam.java @@ -27,8 +27,6 @@ public class ClientParam implements Serializable { private Long userId; - @NotNull(message = "clientNo参数缺失", groups = {create.class, update.class}) - @DecimalMin(value = "0", message = "clientNo参数值不能少于0", groups = {create.class, update.class}) private String clientNo; @NotNull(message = "clientName参数缺失", groups = {create.class, update.class}) diff --git a/admin/src/main/java/com/hcy/admin/validate/order/RepairOrderAuditParam.java b/admin/src/main/java/com/hcy/admin/validate/order/RepairOrderAuditParam.java index c85df7a..fc9a49c 100644 --- a/admin/src/main/java/com/hcy/admin/validate/order/RepairOrderAuditParam.java +++ b/admin/src/main/java/com/hcy/admin/validate/order/RepairOrderAuditParam.java @@ -84,4 +84,10 @@ public class RepairOrderAuditParam implements Serializable { private String orderNo; // 订单编号 private String moduleCode; // 模块代码 private String clientName; // 客户名称 + + private Integer qualityTestingResult; // 质检结果(0=通过,1=不通过) + private Long qualityTestingId; // 质检人 + private Date qualityTestingTime; // 质检时间 + private String qualityTestingOpinion; // 质检意见 + private String qualityTestingImg; // 质检图片 } 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 790d387..05e300e 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 @@ -79,5 +79,5 @@ public class SystemAuthAdminParam implements Serializable { private Integer receiveOrderStatus; //接单状态(0=休假/停止接单中 1=作业中 2=可接单) private Integer isApprentice; // 是否学徒 0=否,1=是 private String likeWork; // 模糊查询(姓名/联系电话) - + private String goodSkill; //擅长技能 } diff --git a/admin/src/main/java/com/hcy/admin/vo/excel/order/BeyondRepairOrder.java b/admin/src/main/java/com/hcy/admin/vo/excel/order/BeyondRepairOrder.java index ea9b026..c18eeee 100644 --- a/admin/src/main/java/com/hcy/admin/vo/excel/order/BeyondRepairOrder.java +++ b/admin/src/main/java/com/hcy/admin/vo/excel/order/BeyondRepairOrder.java @@ -39,8 +39,8 @@ public class BeyondRepairOrder { @ApiModelProperty(value = "退仓原因") private String reasonForWithdrawal; - @ApiModelProperty(value = "更换明细") - private String replacementDetail; +// @ApiModelProperty(value = "更换明细") +// private String replacementDetail; @ApiModelProperty(value = "制单人") private String creator; diff --git a/admin/src/main/java/com/hcy/admin/vo/excel/order/ClientCollarExcel.java b/admin/src/main/java/com/hcy/admin/vo/excel/order/ClientCollarExcel.java new file mode 100644 index 0000000..64dd351 --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/vo/excel/order/ClientCollarExcel.java @@ -0,0 +1,89 @@ +package com.hcy.admin.vo.excel.order; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.hcy.common.utils.excel.DownloadUrlConverter; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.net.URL; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ContentRowHeight(100) +public class ClientCollarExcel { + + @ApiModelProperty(value = "序号") + private Integer index; + + @ApiModelProperty(value = "工单编号") + private String orderNo; + + @ApiModelProperty(value = "客户名称") + private String clientName; + + @ApiModelProperty(value = "型号/规格") + private String specificationsModel; + + @ApiModelProperty(value = "模块代码") + private String modelCode; + + @ApiModelProperty(value = "功率") + private String power; + + @ApiModelProperty(value = "维修人员") + private String maintenanceMan; + + @ApiModelProperty(value = "拆机") + @ExcelProperty(value = "拆机", converter = DownloadUrlConverter.class) + private List dismantle; + + @ApiModelProperty(value = "除尘") + @ExcelProperty(value = "除尘", converter = DownloadUrlConverter.class) + private List dedusting; + + @ApiModelProperty(value = "排查结果") + private String scrapOrNot; + + @ApiModelProperty(value = "维修前图片") + @ExcelProperty(value = "维修前图片", converter = DownloadUrlConverter.class) + private List repairFront; + + @ApiModelProperty(value = "维修中图片") + @ExcelProperty(value = "维修中图片", converter = DownloadUrlConverter.class) + private List repairIng; + + @ApiModelProperty(value = "维修后图片") + @ExcelProperty(value = "维修后图片)", converter = DownloadUrlConverter.class) + private List repairBack; + + @ApiModelProperty(value = "功能测试") + @ExcelProperty(value = "功能测试", converter = DownloadUrlConverter.class) + private List functionalTestImg; + + @ApiModelProperty(value = "DC&PFC组装") + @ExcelProperty(value = "DC&PFC组装", converter = DownloadUrlConverter.class) + private List assembleImg; + + @ApiModelProperty(value = "补强三防漆和点胶") + @ExcelProperty(value = "补强三防漆和点胶", converter = DownloadUrlConverter.class) + private List reinforcingThreeAntiPaintAndDispensing; + + @ApiModelProperty(value = "模块装配") + @ExcelProperty(value = "模块装配", converter = DownloadUrlConverter.class) + private List moduleAssembly; + + @ApiModelProperty(value = "老化测试") + @ExcelProperty(value = "老化测试", converter = DownloadUrlConverter.class) + private List agingTest; + + @ApiModelProperty(value = "报废图片") + @ExcelProperty(value = "报废图片", converter = DownloadUrlConverter.class) + private List scrapPicture; +} diff --git a/admin/src/main/java/com/hcy/admin/vo/excel/order/ClientCollerExcel.java b/admin/src/main/java/com/hcy/admin/vo/excel/order/ClientCollerExcel.java new file mode 100644 index 0000000..f1721b7 --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/vo/excel/order/ClientCollerExcel.java @@ -0,0 +1,50 @@ +package com.hcy.admin.vo.excel.order; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +/** + * 客户领机单 + */ +public class ClientCollerExcel { + + @ApiModelProperty(value = "序号") + private Integer index; + + @ApiModelProperty(value = "客户名称") + private String clientName; + + @ApiModelProperty(value = "单据编号") + private String orderNo; + + @ApiModelProperty(value = "型号/规格") + private String specificationsModel; + + @ApiModelProperty(value = "模块代码") + private String modelCode; + + @ApiModelProperty(value = "功率") + private String power; + + @ApiModelProperty(value = "是否返修") + private String isRepair; + + @ApiModelProperty(value = "维修人员") + private String maintenanceMan; + + @ApiModelProperty(value = "到货日期") + private String arrivalTime; + + @ApiModelProperty(value = "质保期限") + private String warrantyPeriod; + + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/admin/src/main/java/com/hcy/admin/vo/excel/order/GetMaterialsOrder.java b/admin/src/main/java/com/hcy/admin/vo/excel/order/GetMaterialsOrder.java index 5eee2dc..da6eced 100644 --- a/admin/src/main/java/com/hcy/admin/vo/excel/order/GetMaterialsOrder.java +++ b/admin/src/main/java/com/hcy/admin/vo/excel/order/GetMaterialsOrder.java @@ -7,6 +7,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; + @Data @Builder @NoArgsConstructor @@ -46,6 +48,9 @@ public class GetMaterialsOrder { @ApiModelProperty(value = "领取人员") private String recipient; + @ApiModelProperty(value = "配件单价") + private String unitPrice; + @ApiModelProperty(value = "制单人") private String creator; diff --git a/admin/src/main/java/com/hcy/admin/vo/excel/order/MachineClaimNote.java b/admin/src/main/java/com/hcy/admin/vo/excel/order/MachineClaimNote.java index 624cedf..46baf2a 100644 --- a/admin/src/main/java/com/hcy/admin/vo/excel/order/MachineClaimNote.java +++ b/admin/src/main/java/com/hcy/admin/vo/excel/order/MachineClaimNote.java @@ -18,6 +18,9 @@ public class MachineClaimNote { @ApiModelProperty(value = "序号") private Integer index; + @ApiModelProperty(value = "单据编号") + private String orderNo; + @ApiModelProperty(value = "型号/规格") private String specificationsModel; @@ -30,11 +33,19 @@ public class MachineClaimNote { @ApiModelProperty(value = "是否返修") private String isRepair; - @ApiModelProperty(value = "维修结论") - private String result; - @ApiModelProperty(value = "维修人员") private String maintenanceMan; + @ApiModelProperty(value = "快递到达日期") + private String deliveryDate; + + @ApiModelProperty(value = "维修周期") + private String maintenanceCycle; + + @ApiModelProperty(value = "质保期限") + private String warrantyPeriod; + + @ApiModelProperty(value = "备注") + private String remark; } diff --git a/admin/src/main/java/com/hcy/admin/vo/excel/order/ScrapForm.java b/admin/src/main/java/com/hcy/admin/vo/excel/order/ScrapForm.java index cfca14c..8e77b91 100644 --- a/admin/src/main/java/com/hcy/admin/vo/excel/order/ScrapForm.java +++ b/admin/src/main/java/com/hcy/admin/vo/excel/order/ScrapForm.java @@ -59,9 +59,12 @@ public class ScrapForm { @ApiModelProperty(value = "运维建议") private String operationsSuggest; - @ApiModelProperty(value = "制单及经手人") + @ApiModelProperty(value = "审核人") private String creator; + @ApiModelProperty(value = "确认人") // 质检人 + private String qualityTestingName; + @ApiModelProperty(value = "制单日期") private String deliveryTime; } diff --git a/admin/src/main/java/com/hcy/admin/vo/excel/order/WarehouseWarrantWIPExcel.java b/admin/src/main/java/com/hcy/admin/vo/excel/order/WarehouseWarrantWIPExcel.java new file mode 100644 index 0000000..f0909f2 --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/vo/excel/order/WarehouseWarrantWIPExcel.java @@ -0,0 +1,57 @@ +package com.hcy.admin.vo.excel.order; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +/** + * 入库WIP表 + */ +public class WarehouseWarrantWIPExcel { + + @ApiModelProperty(value = "序号") + private Integer index; + + @ApiModelProperty(value = "客户名称") + private String clientName; + + @ApiModelProperty(value = "单据编号") + private String orderNo; + + @ApiModelProperty(value = "快递到达日期") + private String deliveryDate; + + @ApiModelProperty(value = "入库日期") + private String warehousingDate; + + @ApiModelProperty(value = "型号/规格") + private String specificationsModel; + + @ApiModelProperty(value = "模块代码") + private String modelCode; + + @ApiModelProperty(value = "功率") + private String power; + + @ApiModelProperty(value = "是否返修") + private String isRepair; + +// @ApiModelProperty(value = "维修人员") +// private String maintenanceMan; + + @ApiModelProperty(value = "维修周期") + private String maintenanceCycle; + + @ApiModelProperty(value = "质保期限") + private String warrantyPeriod; + + @ApiModelProperty(value = "备注") + private String remark; + +} diff --git a/admin/src/main/java/com/hcy/admin/vo/largeData/UserLargeDataVo.java b/admin/src/main/java/com/hcy/admin/vo/largeData/UserLargeDataVo.java index d30215a..ffc275a 100644 --- a/admin/src/main/java/com/hcy/admin/vo/largeData/UserLargeDataVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/largeData/UserLargeDataVo.java @@ -46,4 +46,5 @@ public class UserLargeDataVo implements Serializable { private String province; //省 private String city; //市 private String district; //区 + private String goodSkill; //擅长技能 } diff --git a/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartListVo.java b/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartListVo.java index 3cd9041..382cc8b 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartListVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartListVo.java @@ -23,7 +23,7 @@ public class OrderSparePartListVo implements Serializable { private Long warehouseId; // 所属仓库id private String specificationsModel; // 规格型号 private String unit; // 单位 - private BigDecimal unitPrice; // 价格 + private String unitPrice; // 价格 private Integer quantity; // 库存数量 private Integer count; // 出入库数量 private BigDecimal totalPrice; // 总价 diff --git a/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartUseListVo.java b/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartUseListVo.java index cb69420..91bed08 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartUseListVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartUseListVo.java @@ -23,7 +23,7 @@ public class OrderSparePartUseListVo implements Serializable { private Long warehouseId; // 仓库id private String specificationsModel; // 规格型号 private String unit; // 单位 - private BigDecimal unitPrice; // 价格 + private String unitPrice; // 价格 private Integer count; // 出入库数量 private Integer quantity; // 库存数量 private Integer useNumber; // 使用数量 diff --git a/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartUseVo.java b/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartUseVo.java index ac51faa..a192cc9 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartUseVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/OrderSparePartUseVo.java @@ -23,7 +23,7 @@ public class OrderSparePartUseVo implements Serializable { private Long warehouseId; // 仓库id private String specificationsModel; // 规格型号 private String unit; // 单位 - private BigDecimal unitPrice; // 价格 + private String unitPrice; // 价格 private Integer count; // 出入库数量 private Integer quantity; // 库存数量 private Integer useNumber; // 使用数量 diff --git a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderAuditDetailVo.java b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderAuditDetailVo.java index 7fec0bd..f53c0be 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderAuditDetailVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderAuditDetailVo.java @@ -71,5 +71,19 @@ public class RepairOrderAuditDetailVo implements Serializable { private String withdrawalImg; // 退仓图片 + private String recollarFittingRemark; // 重领配件备注 + private Integer qualityTestingResult; // 质检结果(0=通过,1=不通过) + private Long qualityTestingId; // 质检人 + private Date qualityTestingTime; // 质检时间 + private String qualityTestingOpinion; // 质检意见 + private String qualityTestingImg; // 质检图片 + private String whatWasRepairedOne; // 维修了什么1 + private String whatWasRepairedTwo; // 维修了什么2 + private String whatWasRepairedThree; // 维修了什么3 + private String questionOne; // 问题1 + private String questionTwo; // 问题2 + private String questionThree; // 问题3 + + private String reasonOfCancellation; // 取消原因 } diff --git a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderAuditListVo.java b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderAuditListVo.java index 0ea87a3..87667d1 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderAuditListVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderAuditListVo.java @@ -61,4 +61,17 @@ public class RepairOrderAuditListVo implements Serializable { private String withdrawalImg; // 退仓申请图片 private List partsUseList; // 配件使用清单 private String cancellationRequestImg; // 退仓申请图片 + + private Integer qualityTestingResult; // 质检结果(0=通过,1=不通过) + private Long qualityTestingId; // 质检人 + private Date qualityTestingTime; // 质检时间 + private String qualityTestingOpinion; // 质检意见 + private String qualityTestingImg; // 质检图片 + private String whatWasRepairedOne; // 维修了什么1 + private String whatWasRepairedTwo; // 维修了什么2 + private String whatWasRepairedThree; // 维修了什么3 + private String questionOne; // 问题1 + private String questionTwo; // 问题2 + private String questionThree; // 问题3 + } diff --git a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderDetailVo.java b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderDetailVo.java index 99c572b..226323b 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderDetailVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderDetailVo.java @@ -176,4 +176,6 @@ public class RepairOrderDetailVo implements Serializable { private RepairOrderAuditListVo cancellationRequestListVo; // 退仓申请信息 private RepairOrderAuditDetailVo scrapDate;//报废审核信息 + private Integer receiveOrNot; // 是否已领用(0=是,1=否) + } diff --git a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderListVo.java b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderListVo.java index 76602f9..10cdef2 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderListVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderListVo.java @@ -107,4 +107,16 @@ public class RepairOrderListVo implements Serializable { private Integer repairNextStep; // 下个步骤(0=拆机,1=清洗,2=故障排查,3=确认签名,4=重领配件,5=上传维修前图片,6=上传维修中图片,7=上传维修后图片,8=补强三防漆,9=补强点胶,10=DC&PFC组装,11=补强三防漆和点胶,12=模块装配,13=功能测试,14=老化测试,15=包装出货,16=填写回单) private List orderPartCodeList; // 配件编码列表 private Integer timeoutOrNot; // 是否超时(0=是,1=否) + + private Long faultPhenomenonId; // 故障现象id + private Long faultCauseId; // 故障原因id + private Long sourceOfDamageId; // 损坏原因id + private Long operationsSuggestId; // 运维建议id + + private Integer type; // 扫码核对(0=入库,1=返修) + private String returnReason; // 返修原因 + private Integer returning; //是否在退仓中(0=是,1=否) + private Integer feedingOrNot; //是否在补料中(0=是,1=否) + private Integer receiveOrNot; // 是否已领用(0=是,1=否) + } diff --git a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderShippingListVo.java b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderShippingListVo.java index b098abd..29cd39c 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderShippingListVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderShippingListVo.java @@ -33,4 +33,6 @@ public class RepairOrderShippingListVo implements Serializable { private Integer index; // 序号 private List repairOrderList; //发货清单 + + } diff --git a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderStepDataVo.java b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderStepDataVo.java index baa6b17..e311f6e 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderStepDataVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderStepDataVo.java @@ -20,4 +20,5 @@ public class RepairOrderStepDataVo implements Serializable { private Date createTime; // 创建时间 private String creatorName; // 创建人名称 private Integer isApprentice; //是否学徒:0=否 1=是 + private Integer scrapOrNot; // 是否报废(0=是,1=否) } diff --git a/admin/src/main/java/com/hcy/admin/vo/system/SystemAuthAdminVo.java b/admin/src/main/java/com/hcy/admin/vo/system/SystemAuthAdminVo.java index 24f2c57..5e2bd15 100644 --- a/admin/src/main/java/com/hcy/admin/vo/system/SystemAuthAdminVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/system/SystemAuthAdminVo.java @@ -43,5 +43,5 @@ public class SystemAuthAdminVo implements Serializable { private Integer technicalGrade; // 技术等级(0=初级,1=中级,2=高级) private Integer receiveOrderStatus; //接单状态(0=休假/停止接单中 1=作业中 2=可接单) private Integer isApprentice; // 是否学徒 0=否,1=是 - + private String goodSkill; //擅长技能 } diff --git a/admin/src/main/resources/templates/excel/ClientCollar.xlsx b/admin/src/main/resources/templates/excel/ClientCollar.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7d825234a513c5114cbcdd9649494990fb6f414a GIT binary patch literal 11379 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 CN8xh- literal 0 HcmV?d00001 diff --git a/admin/src/main/resources/templates/excel/WarehouseWarrantWIP.xlsx b/admin/src/main/resources/templates/excel/WarehouseWarrantWIP.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..963e79fa867fe1ffe78aaba09e6af7bf2dc01361 GIT binary patch literal 11414 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 WrHEqr#0?B_BY<&57&J)!5AL6$BZfx+ delta 3031 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 diff --git a/admin/src/main/resources/templates/excel/materialRequisition.xlsx b/admin/src/main/resources/templates/excel/materialRequisition.xlsx index 09d8f22f5939d5a75cfe81b6cfda7cb42762ecdd..d12d1ad0abecad8a64306c5dfd632387cddfd6da 100644 GIT binary patch delta 16033 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 AfB*mh diff --git a/common/src/main/java/com/hcy/common/dto/SystemAuthAdminDto.java b/common/src/main/java/com/hcy/common/dto/SystemAuthAdminDto.java index 8d0ef98..217d082 100644 --- a/common/src/main/java/com/hcy/common/dto/SystemAuthAdminDto.java +++ b/common/src/main/java/com/hcy/common/dto/SystemAuthAdminDto.java @@ -40,5 +40,6 @@ public class SystemAuthAdminDto implements Serializable { private Integer technicalGrade; // 技术等级(0=初级,1=中级,2=高级) private Integer isApprentice; // 是否学徒 0=否,1=是 private String likeWork; // 模糊查询(姓名/联系电话) + private String goodSkill; //擅长技能 } 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 7be8d5f..050c899 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 @@ -45,5 +45,15 @@ public class RepairOrderAuditDto implements Serializable { private Date createTime; // 创建时间 private Date updateTime; // 更新时间 private Date deleteTime; // 删除时间 - + private Integer qualityTestingResult; // 质检结果(0=通过,1=不通过) + private Long qualityTestingId; // 质检人 + private Date qualityTestingTime; // 质检时间 + private String qualityTestingOpinion; // 质检意见 + private String qualityTestingImg; // 质检图片 + private String whatWasRepairedOne; // 维修了什么1 + private String whatWasRepairedTwo; // 维修了什么2 + private String whatWasRepairedThree; // 维修了什么3 + private String questionOne; // 问题1 + private String questionTwo; // 问题2 + private String questionThree; // 问题3 } \ No newline at end of file diff --git a/common/src/main/java/com/hcy/common/dto/order/RepairOrderDto.java b/common/src/main/java/com/hcy/common/dto/order/RepairOrderDto.java index 15bdf18..27d03fb 100644 --- a/common/src/main/java/com/hcy/common/dto/order/RepairOrderDto.java +++ b/common/src/main/java/com/hcy/common/dto/order/RepairOrderDto.java @@ -113,4 +113,6 @@ public class RepairOrderDto implements Serializable { private String endTime; //结束时间 private String maintenanceMan; //维修人员 private Integer feedingOrNot; //是否在补料中(0=是,1=否) + private Integer receiveOrNot; // 是否已领用(0=是,1=否) + } diff --git a/common/src/main/java/com/hcy/common/dto/result/UserLargeDataDto.java b/common/src/main/java/com/hcy/common/dto/result/UserLargeDataDto.java index 254d819..b4414e5 100644 --- a/common/src/main/java/com/hcy/common/dto/result/UserLargeDataDto.java +++ b/common/src/main/java/com/hcy/common/dto/result/UserLargeDataDto.java @@ -46,4 +46,5 @@ public class UserLargeDataDto implements Serializable { private String province; //省 private String city; //市 private String district; //区 + private String goodSkill; //擅长技能 } diff --git a/common/src/main/java/com/hcy/common/entity/order/OrderPartCode.java b/common/src/main/java/com/hcy/common/entity/order/OrderPartCode.java index 299052a..0eb31ed 100644 --- a/common/src/main/java/com/hcy/common/entity/order/OrderPartCode.java +++ b/common/src/main/java/com/hcy/common/entity/order/OrderPartCode.java @@ -18,5 +18,6 @@ public class OrderPartCode implements Serializable { private Long id; // 配件编码id private Long repairOrderId; // 维修单id private String partCode; // 配件编码 - + private String partName; // 配件名称 + private Integer isDelete; // 是否删除 0-未删除 1-删除 } \ No newline at end of file diff --git a/common/src/main/java/com/hcy/common/entity/order/OrderSparePartUse.java b/common/src/main/java/com/hcy/common/entity/order/OrderSparePartUse.java index a7bd946..c591802 100644 --- a/common/src/main/java/com/hcy/common/entity/order/OrderSparePartUse.java +++ b/common/src/main/java/com/hcy/common/entity/order/OrderSparePartUse.java @@ -18,6 +18,7 @@ public class OrderSparePartUse implements Serializable { @TableId(value="id", type= IdType.AUTO) private Long id; // 主键id private Long repairOrderId; // 维修订单id + private Long repairOrderAuditId; // 维修模块审核id private Integer reviewRequest; // 审核申请(0-退仓申请、1-领料申请、2-良品入库、3-报废申请) private Long sparePartsId; // 备件id private String sparePartsCode; // 备件编码 diff --git a/common/src/main/java/com/hcy/common/entity/order/RepairOrder.java b/common/src/main/java/com/hcy/common/entity/order/RepairOrder.java index caa9a67..40cbb20 100644 --- a/common/src/main/java/com/hcy/common/entity/order/RepairOrder.java +++ b/common/src/main/java/com/hcy/common/entity/order/RepairOrder.java @@ -102,5 +102,5 @@ public class RepairOrder implements Serializable { private String returnReason; // 返修原因 private Integer returning; //是否在退仓中(0=是,1=否) private Integer feedingOrNot; //是否在补料中(0=是,1=否) - + private Integer receiveOrNot; // 是否已领用(0=是,1=否) } \ No newline at end of file diff --git a/common/src/main/java/com/hcy/common/entity/order/RepairOrderAudit.java b/common/src/main/java/com/hcy/common/entity/order/RepairOrderAudit.java index f9f6942..5f6d563 100644 --- a/common/src/main/java/com/hcy/common/entity/order/RepairOrderAudit.java +++ b/common/src/main/java/com/hcy/common/entity/order/RepairOrderAudit.java @@ -43,4 +43,15 @@ public class RepairOrderAudit implements Serializable { private Date updateTime; // 更新时间 private Date deleteTime; // 删除时间 + private Integer qualityTestingResult; // 质检结果(0=通过,1=不通过) + private Long qualityTestingId; // 质检人 + private Date qualityTestingTime; // 质检时间 + private String qualityTestingOpinion; // 质检意见 + private String qualityTestingImg; // 质检图片 + private String whatWasRepairedOne; // 维修了什么1 + private String whatWasRepairedTwo; // 维修了什么2 + private String whatWasRepairedThree; // 维修了什么3 + private String questionOne; // 问题1 + private String questionTwo; // 问题2 + private String questionThree; // 问题3 } \ No newline at end of file diff --git a/common/src/main/java/com/hcy/common/entity/order/RepairOrderStepData.java b/common/src/main/java/com/hcy/common/entity/order/RepairOrderStepData.java index db83144..eb40a48 100644 --- a/common/src/main/java/com/hcy/common/entity/order/RepairOrderStepData.java +++ b/common/src/main/java/com/hcy/common/entity/order/RepairOrderStepData.java @@ -2,6 +2,7 @@ package com.hcy.common.entity.order; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.models.auth.In; import lombok.Data; import java.io.Serializable; @@ -33,11 +34,13 @@ public class RepairOrderStepData implements Serializable { private Long creatorId; // 创建人id private Date createTime; // 创建时间 private Integer isDelete; // 是否删除: [0=否, 1=是] + private Integer scrapOrNot; // 是否报废(0=是,1=否) public RepairOrderStepData() { } - public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, Long creatorId) { + public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, + Long creatorId) { this.repairOrderId = repairOrderId; this.repairStep = repairStep; this.remark = remark; @@ -46,17 +49,19 @@ public class RepairOrderStepData implements Serializable { this.creatorId = creatorId; } - public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer dscType, Integer auditStatus, Long creatorId) { + public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, + Long creatorId, Long repairOrderAuditId) { this.repairOrderId = repairOrderId; this.repairStep = repairStep; this.remark = remark; this.img = img; this.title = title; - this.dscType = dscType; - this.auditStatus = auditStatus; this.creatorId = creatorId; + this.repairOrderAuditId = repairOrderAuditId; } - public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer dscType, Integer auditStatus, Long creatorId, Long repairOrderAuditId) { + + public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, + Integer dscType, Integer auditStatus, Long creatorId, Long repairOrderAuditId) { this.repairOrderId = repairOrderId; this.repairStep = repairStep; this.remark = remark; @@ -67,7 +72,48 @@ public class RepairOrderStepData implements Serializable { this.creatorId = creatorId; this.repairOrderAuditId = repairOrderAuditId; } - public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer auditStatus, Long creatorId) { + + public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, + Integer dscType, Integer auditStatus, Long creatorId, Integer scrapOrNot) { + this.repairOrderId = repairOrderId; + this.repairStep = repairStep; + this.remark = remark; + this.img = img; + this.title = title; + this.dscType = dscType; + this.auditStatus = auditStatus; + this.creatorId = creatorId; + this.scrapOrNot = scrapOrNot; + } + + public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer dscType, + Integer auditStatus, Long creatorId, Long repairOrderAuditId, Integer scrapOrNot) { + this.repairOrderId = repairOrderId; + this.repairStep = repairStep; + this.remark = remark; + this.img = img; + this.title = title; + this.dscType = dscType; + this.auditStatus = auditStatus; + this.creatorId = creatorId; + this.repairOrderAuditId = repairOrderAuditId; + this.scrapOrNot = scrapOrNot; + } + + public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer auditStatus, + Long creatorId,Integer scrapOrNot) { + this.repairOrderId = repairOrderId; + this.repairStep = repairStep; + this.remark = remark; + this.img = img; + this.title = title; + this.auditStatus = auditStatus; + this.creatorId = creatorId; + this.scrapOrNot = scrapOrNot; + } + + public RepairOrderStepData(Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer auditStatus, + Long creatorId) { this.repairOrderId = repairOrderId; this.repairStep = repairStep; this.remark = remark; @@ -77,7 +123,8 @@ public class RepairOrderStepData implements Serializable { this.creatorId = creatorId; } - public RepairOrderStepData(Long id , Long repairOrderId, Integer repairStep, String remark, String img, String title, Long creatorId, Date createTime) { + public RepairOrderStepData(Long id , Long repairOrderId, Integer repairStep, String remark, String img, String title, + Long creatorId, Date createTime) { this.id = id; this.repairOrderId = repairOrderId; this.repairStep = repairStep; @@ -88,7 +135,21 @@ public class RepairOrderStepData implements Serializable { this.createTime = createTime; } - public RepairOrderStepData(Long id ,Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer dscType, Integer auditStatus, Long creatorId, Date createTime) { + public RepairOrderStepData(Long id , Long repairOrderId, Integer repairStep, String remark, String img, String title, + Long creatorId, Date createTime, Long repairOrderAuditId) { + this.id = id; + this.repairOrderId = repairOrderId; + this.repairStep = repairStep; + this.remark = remark; + this.img = img; + this.title = title; + this.creatorId = creatorId; + this.createTime = createTime; + this.repairOrderAuditId = repairOrderAuditId; + } + + public RepairOrderStepData(Long id ,Long repairOrderId, Integer repairStep, String remark, String img, String title, + Integer dscType, Integer auditStatus, Long creatorId, Date createTime, Integer scrapOrNot) { this.id = id; this.repairOrderId = repairOrderId; this.repairStep = repairStep; @@ -99,9 +160,12 @@ public class RepairOrderStepData implements Serializable { this.auditStatus = auditStatus; this.creatorId = creatorId; this.createTime = createTime; + this.scrapOrNot = scrapOrNot; } - public RepairOrderStepData(Long id ,Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer dscType, Integer auditStatus, Long creatorId, Date createTime, Long repairOrderAuditId) { + + public RepairOrderStepData(Long id ,Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer dscType, + Integer auditStatus, Long creatorId, Date createTime, Long repairOrderAuditId, Integer scrapOrNot) { this.id = id; this.repairOrderId = repairOrderId; this.repairStep = repairStep; @@ -113,9 +177,11 @@ public class RepairOrderStepData implements Serializable { this.creatorId = creatorId; this.createTime = createTime; this.repairOrderAuditId = repairOrderAuditId; + this.scrapOrNot = scrapOrNot; } - public RepairOrderStepData(Long id ,Long repairOrderId, Integer repairStep, String remark, String img, String title, Integer auditStatus, Long creatorId, Date createTime) { + public RepairOrderStepData(Long id ,Long repairOrderId, Integer repairStep, String remark, String img, + String title, Integer auditStatus, Long creatorId, Date createTime) { this.id = id; this.repairOrderId = repairOrderId; this.repairStep = repairStep; @@ -126,4 +192,32 @@ public class RepairOrderStepData implements Serializable { this.creatorId = creatorId; this.createTime = createTime; } + + public RepairOrderStepData(Long id ,Long repairOrderId, Integer repairStep, String remark, String img, + String title, Integer auditStatus, Long creatorId, Date createTime,Long repairOrderAuditId) { + this.id = id; + this.repairOrderId = repairOrderId; + this.repairStep = repairStep; + this.remark = remark; + this.img = img; + this.title = title; + this.auditStatus = auditStatus; + this.creatorId = creatorId; + this.createTime = createTime; + this.repairOrderAuditId = repairOrderAuditId; + } + + public RepairOrderStepData(Long id , Long repairOrderId, Integer repairStep, String remark, String img, String title, + Integer auditStatus, Long creatorId, Date createTime, Integer scrapOrNot) { + this.id = id; + this.repairOrderId = repairOrderId; + this.repairStep = repairStep; + this.remark = remark; + this.img = img; + this.title = title; + this.auditStatus = auditStatus; + this.creatorId = creatorId; + this.createTime = createTime; + this.scrapOrNot = scrapOrNot; + } } \ No newline at end of file diff --git a/common/src/main/java/com/hcy/common/entity/system/SystemAuthAdmin.java b/common/src/main/java/com/hcy/common/entity/system/SystemAuthAdmin.java index db4fef0..5f50738 100644 --- a/common/src/main/java/com/hcy/common/entity/system/SystemAuthAdmin.java +++ b/common/src/main/java/com/hcy/common/entity/system/SystemAuthAdmin.java @@ -48,4 +48,5 @@ public class SystemAuthAdmin implements Serializable { @TableField(updateStrategy = FieldStrategy.IGNORED) private Long userId; //用户id private Integer isApprentice; // 是否学徒 0=否,1=是 + private String goodSkill; //擅长技能 } diff --git a/common/src/main/java/com/hcy/common/entity/user/User.java b/common/src/main/java/com/hcy/common/entity/user/User.java index b053edc..12927a9 100644 --- a/common/src/main/java/com/hcy/common/entity/user/User.java +++ b/common/src/main/java/com/hcy/common/entity/user/User.java @@ -45,4 +45,5 @@ public class User implements Serializable { private String longitude; // 经度 private String latitude; // 纬度 private Long warehouseId; // 仓库id + private String goodSkill; //擅长技能 } diff --git a/common/src/main/java/com/hcy/common/enums/order/RepairOrderAuditStatusEnum.java b/common/src/main/java/com/hcy/common/enums/order/RepairOrderAuditStatusEnum.java index 41ab136..31fca5c 100644 --- a/common/src/main/java/com/hcy/common/enums/order/RepairOrderAuditStatusEnum.java +++ b/common/src/main/java/com/hcy/common/enums/order/RepairOrderAuditStatusEnum.java @@ -9,7 +9,7 @@ import java.util.Map; * @author dabin */ public enum RepairOrderAuditStatusEnum { - // 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认、6=已取消) + // 审核状态(0=待审核、1=待入库、2=审核未通过、3=已完成,4=待领取、5=待确认、6=已取消、7=待质检、8=质检不通过) TO_BE_REVIEWED(0,"待审核"), STOCK_PENDING(1,"待入库"), FAIL_THE_AUDIT(2,"审核未通过"), @@ -17,6 +17,9 @@ public enum RepairOrderAuditStatusEnum { UNCLAIMED(4,"待领取"), TO_BE_CONFIRMED(5,"待确认"), CANCELED(6,"已取消"), + WAIT_FOR_QUALITY_INSPECTION(7, "待质检"), + FAILURE_OF_QUALITY_INSPECTION(8, "质检不通过"), + //审核事项(0-退仓申请、1-领料申请、2-良品入库、3-报废申请、4-填写维修信息) CANCELLATION_REQUEST(0,"退仓申请"), diff --git a/common/src/main/java/com/hcy/common/enums/order/RepairOrderStatusEnum.java b/common/src/main/java/com/hcy/common/enums/order/RepairOrderStatusEnum.java index d13d365..ca5465c 100644 --- a/common/src/main/java/com/hcy/common/enums/order/RepairOrderStatusEnum.java +++ b/common/src/main/java/com/hcy/common/enums/order/RepairOrderStatusEnum.java @@ -53,6 +53,10 @@ public enum RepairOrderStatusEnum { APPLICATION_FOR_SCRAP(3,"报废申请"), FILL_IN_MAINTENANCE_INFORMATION(4,"填写维修信息"), + //扫码核对(0=入库,1=返修) + STORAGE(0,"入库"), + REPAIR(1,"返修"), + //发货状态(0=未发货,1=已发货) NOT_YET_SHIPPED(0,"未发货"), SHIPPED(1,"已发货"); diff --git a/common/src/main/java/com/hcy/common/mapper/order/OrderSparePartMapper.java b/common/src/main/java/com/hcy/common/mapper/order/OrderSparePartMapper.java index 37fd177..9164f01 100644 --- a/common/src/main/java/com/hcy/common/mapper/order/OrderSparePartMapper.java +++ b/common/src/main/java/com/hcy/common/mapper/order/OrderSparePartMapper.java @@ -40,7 +40,7 @@ public interface OrderSparePartMapper extends IBaseMapper { "WHERE\n" + "\troa.repair_order_id = #{moduleId} \n" + "\tAND roa.review_request = 1\n" + - "\tAND roa.audit_status = 3") + "\tAND roa.audit_status = 3 and osp.is_delete = 0") List findOrderSparePartByModuleId(@Param("moduleId") Long moduleId); /** @@ -48,7 +48,7 @@ public interface OrderSparePartMapper extends IBaseMapper { * @param repairOrderId 检修工单id * @return 数量 */ - @Select("SELECT * FROM la_order_spare_part WHERE repair_order_id = #{repairOrderId} and repair_order_audit_id = #{repairOrderAuditId}") + @Select("SELECT * FROM la_order_spare_part WHERE is_delete = 0 and repair_order_id = #{repairOrderId} and repair_order_audit_id = #{repairOrderAuditId}") List findOrderSparePartByRepairOrderIdAndRepairOrderAuditId(@Param("repairOrderId") Long repairOrderId, @Param("repairOrderAuditId") Long repairOrderAuditId); } diff --git a/common/src/main/java/com/hcy/common/mapper/order/RepairOrderAuditMapper.java b/common/src/main/java/com/hcy/common/mapper/order/RepairOrderAuditMapper.java index ef6e66e..e9d7b0e 100644 --- a/common/src/main/java/com/hcy/common/mapper/order/RepairOrderAuditMapper.java +++ b/common/src/main/java/com/hcy/common/mapper/order/RepairOrderAuditMapper.java @@ -25,9 +25,9 @@ public interface RepairOrderAuditMapper extends IBaseMapper { */ IPage auditMattersList(@Param("page") Page page, @Param("param")RepairOrderAuditDto repairOrderAuditDto); - @Select("select * from la_repair_order_audit where repair_order_id = #{repairOrderId} and review_request = #{reviewRequest}") + @Select("select * from la_repair_order_audit where audit_status = 3 and repair_order_id = #{repairOrderId} and review_request = #{reviewRequest} ORDER BY create_time desc LIMIT 1") RepairOrderAudit findRepairOrderAuditByRepairOrderIdAndReviewRequest(@Param("repairOrderId") Long repairOrderId,@Param("reviewRequest") Long reviewRequest); - @Select("select * from la_repair_order_audit where repair_order_id = #{repairOrderId} and (review_request = #{reviewRequestOne} or review_request = #{reviewRequestTwo})") + @Select("select * from la_repair_order_audit where repair_order_id = #{repairOrderId} and (review_request = #{reviewRequestOne} or review_request = #{reviewRequestTwo}) ORDER BY create_time desc LIMIT 1") RepairOrderAudit findRepairOrderAuditByRepairOrderIdAndTwoReviewRequest(@Param("repairOrderId") Long repairOrderId,@Param("reviewRequestOne") Long reviewRequestOne, @Param("reviewRequestTwo") Long reviewRequestTwo); @Select("select * from la_repair_order_audit where repair_order_id = #{repairOrderId} and (review_request = #{reviewRequestOne} or review_request = #{reviewRequestTwo} or review_request = #{reviewRequestThree})") diff --git a/common/src/main/java/com/hcy/common/mapper/order/RepairOrderMapper.java b/common/src/main/java/com/hcy/common/mapper/order/RepairOrderMapper.java index 704350e..1328989 100644 --- a/common/src/main/java/com/hcy/common/mapper/order/RepairOrderMapper.java +++ b/common/src/main/java/com/hcy/common/mapper/order/RepairOrderMapper.java @@ -83,6 +83,13 @@ public interface RepairOrderMapper extends IBaseMapper { */ Page repairModulePageList(@Param("page") Page page, @Param("form") RepairOrderDto form); + /** + * 维修模块列表,不分页 + * @param form + * @return + */ + List repairModuleList(@Param("form") RepairOrderDto form); + /** * 审核事项 * @param page diff --git a/common/src/main/resources/mapper/RepairOrderMapper.xml b/common/src/main/resources/mapper/RepairOrderMapper.xml index b1a2e8a..15663ad 100644 --- a/common/src/main/resources/mapper/RepairOrderMapper.xml +++ b/common/src/main/resources/mapper/RepairOrderMapper.xml @@ -239,6 +239,39 @@ order by ro.update_time desc + +