From 2280a35d6bc0fe0f729f925223a268df125ba24c Mon Sep 17 00:00:00 2001 From: sunjianxi <839419401@qq.com> Date: Mon, 7 Apr 2025 09:05:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contraller/MaintenanceController.java | 99 +++++++++++++++++- .../contraller/WorkOrderController.java | 68 +++++++++++- .../contraller/supplies/ApplyController.java | 30 ++++-- .../supplies/ApplyGoodsPersonController.java | 84 +++++++++++++++ .../ApplyGoodsPersonDetailController.java | 68 ++++++++++++ .../business/enums/MaintenanceStatusEnum.java | 20 ++++ .../business/enums/WorkOrderStatusEnum.java | 23 +++- .../mapper/ApplyGoodsPersonDetailMapper.java | 33 ++++++ .../mapper/ApplyGoodsPersonDetailMapper.xml | 26 +++++ .../mapper/ApplyGoodsPersonMapper.java | 32 ++++++ .../mapper/ApplyGoodsPersonMapper.xml | 24 +++++ .../business/pojo/dto/MaintenanceTaskDto.java | 1 + .../entity/MaintenanceTaskDetailGoods.java | 6 ++ .../maintenance/MaintenanceTaskDetail.java | 1 + .../maintenance/RepairGoodsOutputData.java | 3 + .../entity/supplies/ApplyGoodsPerson.java | 83 +++++++++++++++ .../supplies/ApplyGoodsPersonDetail.java | 65 ++++++++++++ .../entity/workorder/WorkOrderFillData.java | 2 + .../workorder/WorkOrderRepairMaterial.java | 6 ++ .../pojo/vo/workorder/WorkOrderVO.java | 3 + .../business/service/IWorkOrderService.java | 2 + .../MaintenanceTaskDetailServiceImpl.java | 1 + .../service/impl/WorkOrderServiceImpl.java | 48 +++++++++ .../ApplyGoodsPersonDetailServiceImpl.java | 24 +++++ .../supplies/ApplyGoodsPersonServiceImpl.java | 21 ++++ .../IApplyGoodsPersonDetailService.java | 15 +++ .../supplies/IApplyGoodsPersonService.java | 15 +++ src/main/resources/excel/RepairService.xlsx | Bin 13259 -> 12889 bytes .../excel/WorkOrderServiceSheet.xlsx | Bin 11691 -> 11824 bytes 29 files changed, 791 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/springblade/modules/business/contraller/supplies/ApplyGoodsPersonController.java create mode 100644 src/main/java/org/springblade/modules/business/contraller/supplies/ApplyGoodsPersonDetailController.java create mode 100644 src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonDetailMapper.java create mode 100644 src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonDetailMapper.xml create mode 100644 src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonMapper.java create mode 100644 src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonMapper.xml create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyGoodsPerson.java create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyGoodsPersonDetail.java create mode 100644 src/main/java/org/springblade/modules/business/service/impl/supplies/ApplyGoodsPersonDetailServiceImpl.java create mode 100644 src/main/java/org/springblade/modules/business/service/impl/supplies/ApplyGoodsPersonServiceImpl.java create mode 100644 src/main/java/org/springblade/modules/business/service/supplies/IApplyGoodsPersonDetailService.java create mode 100644 src/main/java/org/springblade/modules/business/service/supplies/IApplyGoodsPersonService.java diff --git a/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java b/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java index aa18903..96aa5e1 100644 --- a/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java +++ b/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java @@ -1,5 +1,6 @@ package org.springblade.modules.business.contraller; +import com.aliyun.oss.ServiceException; import com.aliyuncs.exceptions.ClientException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -15,7 +16,9 @@ import lombok.RequiredArgsConstructor; import org.springblade.common.cache.SysCache; import org.springblade.common.cache.UserCache; import org.springblade.common.constant.CommonConstant; +import org.springblade.common.utils.LogUtil; import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.log.annotation.ApiLog; import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; @@ -26,12 +29,20 @@ import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.modules.business.enums.MaintenanceStatusEnum; +import org.springblade.modules.business.enums.WorkOrderStatusEnum; import org.springblade.modules.business.pojo.dto.MaintenanceTaskDto; import org.springblade.modules.business.pojo.entity.MaintenanceTaskDetailGoods; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTask; import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTaskDetail; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPerson; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPersonDetail; +import org.springblade.modules.business.pojo.entity.workorder.WorkOrder; +import org.springblade.modules.business.pojo.entity.workorder.WorkOrderRepairMaterial; +import org.springblade.modules.business.pojo.vo.workorder.WorkOrderVO; import org.springblade.modules.business.service.*; +import org.springblade.modules.business.service.supplies.IApplyGoodsPersonDetailService; +import org.springblade.modules.business.service.supplies.IApplyGoodsPersonService; import org.springblade.modules.business.sms.SmsService; import org.springblade.modules.system.pojo.entity.Dept; import org.springblade.modules.system.pojo.entity.User; @@ -70,6 +81,8 @@ public class MaintenanceController extends BladeController { private final IMessageService messageService; private final IUserService userService; private final IDeptService deptService; + private final IApplyGoodsPersonService applyGoodsPersonService; + private final IApplyGoodsPersonDetailService applyGoodsPersonDetailService; @Value("${sms.template-id2}") private String templateCode; @@ -317,7 +330,7 @@ public class MaintenanceController extends BladeController { } if (!user.getRoleName().contains("administrator") && !user.getRoleName().contains("admin")) { List deptIds = null; - if(user.getRoleName().equals("客服") || user.getRoleName().equals("维修负责人") || user.getRoleName().equals("维修人员")){ + if(user.getRoleName().equals("客服") || user.getRoleName().equals("维修负责人") || user.getRoleName().equals("维修人员") || user.getRoleName().equals("库管员")){ String deptId = user.getDeptId(); List deptList = deptService.list(Wrappers.lambdaQuery(Dept.class).eq(Dept::getParentId,deptId).eq(Dept::getIsDeleted,0)); if(CollectionUtil.isNotEmpty(deptList)){ @@ -377,7 +390,6 @@ public class MaintenanceController extends BladeController { } } taskDetailService.saveOrUpdate(maintenanceTaskDetail); - } return R.success(); } @@ -541,6 +553,88 @@ public class MaintenanceController extends BladeController { return R.success(); } + /** + * 客户确认普通维修效果 + */ + @ApiLog(value = "客户确认维修效果") + @PostMapping("/repair-customer-normal-repair-confirm") + public R customerNormalRepairConfirm(@RequestBody MaintenanceTask task) { + MaintenanceTask taskOld = taskService.getById(task.getId()); + taskOld.setRepairStatus(MaintenanceStatusEnum.REPAIR_CUSTOMER_NORMAL_REPAIR_CONFIRM.getValue()); + taskService.updateById(taskOld); + + return R.success(); + } + + /** + * 维修人员核销库存,待维修主管审批 + */ + @ApiLog(value = "维修人员核销库存,待维修主管审批") + @PostMapping("/repair-serviceman-write-off-inventory") + public R RepairServicemanWriteOffInventory(@RequestBody MaintenanceTaskDto taskDto) { + MaintenanceTask task = taskDto.getTask(); + List detailList = taskDto.getDetailList(); + for(MaintenanceTaskDetail detail : detailList){ + //更新物料信息 + List detailGoods = detail.getDetailGoodsList(); + maintenanceApplyGoodsService.updateBatchById(detailGoods); + //根据物料信息,核销维修人员库存 + for(MaintenanceTaskDetailGoods detailGood : detailGoods){ + ApplyGoodsPerson applyGoodsPerson = applyGoodsPersonService.getOne(Wrappers.lambdaQuery(ApplyGoodsPerson.class).eq(ApplyGoodsPerson::getProductCode,detailGood.getWarehouseId()).eq(ApplyGoodsPerson::getUserId,task.getServicemanId()).eq(BaseEntity::getIsDeleted,0)); + if(applyGoodsPerson != null){ + if(applyGoodsPerson.getNum() - detailGood.getUseNumber() < 0){ + throw new ServiceException("物料"+detailGood.getGoodsName()+"库存不足,请申领后再核销!"); + } + applyGoodsPerson.setNum(applyGoodsPerson.getNum() - detailGood.getUseNumber()); + applyGoodsPersonService.updateById(applyGoodsPerson); + ApplyGoodsPersonDetail applyGoodsPersonDetail = new ApplyGoodsPersonDetail(); + applyGoodsPersonDetail.setOrderId(task.getId()); + applyGoodsPersonDetail.setType("2"); + applyGoodsPersonDetail.setUserId(applyGoodsPerson.getUserId()); + applyGoodsPersonDetail.setUserName(applyGoodsPerson.getUserName()); + applyGoodsPersonDetail.setProductCode(applyGoodsPerson.getProductCode()); + applyGoodsPersonDetail.setProductName(applyGoodsPerson.getProductName()); + applyGoodsPersonDetail.setNum(detailGood.getUseNumber()); + applyGoodsPersonDetailService.save(applyGoodsPersonDetail); + }else{ + throw new ServiceException("物料"+detailGood.getGoodsName()+"库存不足,请申领后再核销!"); + } + } + } + + MaintenanceTask taskOld = taskService.getById(task.getId()); + taskOld.setRepairStatus(MaintenanceStatusEnum.REPAIR_SERVICEMAN_WRITE_OFF_INVENTORY.getValue()); + taskOld.setActualAmount(task.getActualAmount()); + taskService.updateById(taskOld); + + return R.success(); + } + + /** + * 维修主管审批库存 + */ + @ApiLog(value = "维修主管审批库存") + @PostMapping("/repair-supervisor-approve-inventory") + public R RepairSupervisorApproveInventory(@RequestBody MaintenanceTask task) { + MaintenanceTask taskOld = taskService.getById(task.getId()); + taskOld.setRepairStatus(MaintenanceStatusEnum.REPAIR_SUPERVISOR_APPROVE_INVENTORY.getValue()); + taskService.updateById(taskOld); + + return R.success(); + } + + /** + * 维修主管审批库存 + */ + @ApiLog(value = "库管员审批库存") + @PostMapping("/repair-storeman-approve-inventory") + public R RepairStoremanApproveInventory(@RequestBody MaintenanceTask task) { + MaintenanceTask taskOld = taskService.getById(task.getId()); + taskOld.setRepairStatus(MaintenanceStatusEnum.REPAIR_STOREMAN_APPROVE_INVENTORY.getValue()); + taskService.updateById(taskOld); + + return R.success(); + } /*---------- 维修方案结束 ----------*/ @@ -574,4 +668,5 @@ public class MaintenanceController extends BladeController { public void repairOutputService(@RequestBody MaintenanceTask task, HttpServletResponse response) throws IOException { taskDetailService.repairOutputService(task, response); } + } diff --git a/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java b/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java index 6c5b173..5fc7a67 100644 --- a/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java +++ b/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java @@ -29,6 +29,7 @@ import org.springblade.modules.business.pojo.dto.workorder.WorkOrderDTO; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; import org.springblade.modules.business.pojo.entity.workorder.WorkOrder; import org.springblade.modules.business.pojo.entity.workorder.WorkOrderApproval; +import org.springblade.modules.business.pojo.entity.workorder.WorkOrderRepairMaterial; import org.springblade.modules.business.pojo.vo.workorder.WorkOrderVO; import org.springblade.modules.business.service.IMessageService; import org.springblade.modules.business.service.IWorkOrderApprovalService; @@ -87,7 +88,7 @@ public class WorkOrderController extends BladeController { public R> page(WorkOrderDTO workOrderDTO, Query query) { // 创建工作订单的查询条件包装器 LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(WorkOrder.class); - //客服、维修负责人查询所属运维中心下所有实验室的需求提报 + //客服、维修负责人、库管员查询所属运维中心下所有实验室的需求提报 BladeUser user = AuthUtil.getUser(); List deptIds; String deptId = user.getDeptId(); @@ -120,6 +121,11 @@ public class WorkOrderController extends BladeController { // 维修人员 wrapper.eq(WorkOrder::getRepairPerson, AuthUtil.getUserId()); break; + case "6": + // 库管员 + wrapper.ne(WorkOrder::getStatus, WorkOrderStatusEnum.KH_ORDER_DRAFT.getValue()); + wrapper.and(wrp -> wrp.in(WorkOrder::getReportUnit,deptIds).or().eq(WorkOrder::getReportUnit,user.getDeptId())); + break; default: log.error("数据权限设置失败"); return R.fail("数据权限设置失败"); @@ -640,7 +646,7 @@ public class WorkOrderController extends BladeController { workOrderOld.setApproveResult(workOrder.getApproveResult()); workOrderOld.setApproveTime(workOrder.getApproveTime()); workOrderOld.setApproveRemark(workOrder.getApproveRemark()); - workOrderOld.setStatus(WorkOrderStatusEnum.KH_REPAIR_CONFIRM.getValue()); + workOrderOld.setStatus(WorkOrderStatusEnum.KH_EMERGENCY_REPAIR_CONFIRM.getValue()); workOrderService.updateById(workOrderOld); WorkOrderApproval approval = new WorkOrderApproval(workOrder.getId(), AuthUtil.getUserId(), CommonConstant.TRUE_STR, DateUtil.now(), workOrder.getApproveRemark()); @@ -648,7 +654,7 @@ public class WorkOrderController extends BladeController { // todo 审核通过 //保存日志 - LogUtil.saveLog(workOrderOld.getRequirementCode(), WorkOrderStatusEnum.KH_REPAIR_CONFIRM.getName()); + LogUtil.saveLog(workOrderOld.getRequirementCode(), WorkOrderStatusEnum.KH_EMERGENCY_REPAIR_CONFIRM.getName()); //消息发送 messageService.saveMessage(workOrder.getRequirementCode(), "客户审核维修成果已通过,请尽快补填维修方案和物料相关", workOrder.getRepairPerson(), 2); @@ -717,4 +723,60 @@ public class WorkOrderController extends BladeController { LogUtil.saveLog(workOrder.getRequirementCode(),"维修人员撤回维修方案。"); return R.status(true); } + + /** + * 客户确认普通维修效果 + */ + @ApiLog(value = "提报管理-客户确认普通维修效果") + @PostMapping("/customer-normal-repair-confirm") + public R customerNormalRepairConfirm(@RequestBody WorkOrder workOrder) { + WorkOrder workOrderOld = workOrderService.getById(workOrder.getId()); + workOrderOld.setStatus(WorkOrderStatusEnum.KH_NORMAL_REPAIR_CONFIRM.getValue()); + //保存日志 + LogUtil.saveLog(workOrderOld.getRequirementCode(), WorkOrderStatusEnum.KH_NORMAL_REPAIR_CONFIRM.getName()); + workOrderService.updateById(workOrderOld); + + return R.success(""); + } + + /** + * 维修人员核销库存,待维修主管审批 + */ + @ApiLog(value = "提报管理-维修人员核销库存,待维修主管审批") + @PostMapping("/serviceman-write-off-inventory") + public R servicemanWriteOffInventory(@RequestBody WorkOrderVO workOrder) { + workOrderService.servicemanWriteOffInventory(workOrder); + return R.success(""); + } + + /** + * 维修主管审批库存 + */ + @ApiLog(value = "提报管理-维修主管审批库存") + @PostMapping("/supervisor-approve-inventory") + public R supervisorApproveInventory(@RequestBody WorkOrder workOrder) { + WorkOrder workOrderOld = workOrderService.getById(workOrder.getId()); + workOrderOld.setStatus(WorkOrderStatusEnum.ZG_APPROVE_INVENTORY.getValue()); + //保存日志 + LogUtil.saveLog(workOrderOld.getRequirementCode(), WorkOrderStatusEnum.ZG_APPROVE_INVENTORY.getName()); + workOrderService.updateById(workOrderOld); + + return R.success(""); + } + + /** + * 维修主管审批库存 + */ + @ApiLog(value = "提报管理-库管员审批库存") + @PostMapping("/storeman-approve-inventory") + public R storemanApproveInventory(@RequestBody WorkOrder workOrder) { + WorkOrder workOrderOld = workOrderService.getById(workOrder.getId()); + workOrderOld.setStatus(WorkOrderStatusEnum.KG_APPROVE_INVENTORY.getValue()); + //保存日志 + LogUtil.saveLog(workOrderOld.getRequirementCode(), WorkOrderStatusEnum.KG_APPROVE_INVENTORY.getName()); + workOrderService.updateById(workOrderOld); + + return R.success(""); + } + } diff --git a/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyController.java b/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyController.java index d7f65d2..00311d9 100644 --- a/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyController.java +++ b/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyController.java @@ -22,14 +22,10 @@ import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.Func; import org.springblade.modules.business.pojo.dto.supplies.ApplyDTO; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; -import org.springblade.modules.business.pojo.entity.supplies.Apply; -import org.springblade.modules.business.pojo.entity.supplies.ApplyDetail; -import org.springblade.modules.business.pojo.entity.supplies.Goods; +import org.springblade.modules.business.pojo.entity.supplies.*; import org.springblade.modules.business.pojo.entity.workorder.WorkOrder; import org.springblade.modules.business.service.IWorkOrderService; -import org.springblade.modules.business.service.supplies.IApplyDetailService; -import org.springblade.modules.business.service.supplies.IApplyService; -import org.springblade.modules.business.service.supplies.IGoodsService; +import org.springblade.modules.business.service.supplies.*; import org.springblade.modules.system.pojo.entity.Dept; import org.springblade.modules.system.pojo.entity.User; import org.springblade.modules.system.service.IDeptService; @@ -57,6 +53,8 @@ public class ApplyController extends BladeController { private final IGoodsService goodsService; private final IWorkOrderService workOrderService; private final IDeptService deptService; + private final IApplyGoodsPersonService applyGoodsPersonService; + private final IApplyGoodsPersonDetailService applyGoodsPersonDetailService; /** * 物品申领表 详情 @@ -218,6 +216,7 @@ public class ApplyController extends BladeController { } goodsService.updateBatchById(goodsList); } + LogUtil.saveApplyLog(apply.getCode(),user.getRealName()+"审批通过!"); }else{ LogUtil.saveApplyLog(apply.getCode(),user.getRealName()+"审批驳回!"); @@ -258,6 +257,19 @@ public class ApplyController extends BladeController { applyDetail.setIsCk(1); applyDetail.setCkTime(new Date()); applyDetail.setOutNum(applyDetail.getApplyNum()); + //出库时,将对应的物品数量保存到维修人员的物品表中 + ApplyGoodsPerson applyGoodsPerson = applyGoodsPersonService.getOne(Wrappers.lambdaQuery(ApplyGoodsPerson.class).eq(ApplyGoodsPerson::getUserId,apply.getApplyUserId()).eq(ApplyGoodsPerson::getProductCode,applyDetail.getProductCode()).eq(BaseEntity::getIsDeleted,0)); + if(applyGoodsPerson != null){ + applyGoodsPerson.setNum(applyGoodsPerson.getNum() + applyDetail.getApplyNum()); + }else{ + applyGoodsPerson = new ApplyGoodsPerson(); + applyGoodsPerson.setUserId(apply.getApplyUserId()); + applyGoodsPerson.setUserName(apply.getApplyUser()); + applyGoodsPerson.setProductCode(applyDetail.getProductCode()); + applyGoodsPerson.setProductName(applyDetail.getProductName()); + applyGoodsPerson.setNum(applyDetail.getApplyNum()); + } + applyGoodsPersonService.saveOrUpdate(applyGoodsPerson); } if (CollectionUtil.isNotEmpty(detailList)) { @@ -283,11 +295,17 @@ public class ApplyController extends BladeController { applyDetail.setReturnTime(new Date()); applyDetail.setIsReturn(1); goods.setNum(goods.getNum() + applyDetail.getReturnNum()); + + ApplyGoodsPerson applyGoodsPerson = applyGoodsPersonService.getOne(Wrappers.lambdaQuery(ApplyGoodsPerson.class).eq(ApplyGoodsPerson::getUserId,apply.getApplyUserId()).eq(ApplyGoodsPerson::getProductCode,applyDetail.getProductCode()).eq(BaseEntity::getIsDeleted,0)); + applyGoodsPerson.setNum(applyGoodsPerson.getNum() - applyDetail.getReturnNum()); + applyGoodsPersonService.updateById(applyGoodsPerson); + break; } } } goodsService.updateBatchById(goodsList); + } if (CollectionUtil.isNotEmpty(detailList)) { diff --git a/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyGoodsPersonController.java b/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyGoodsPersonController.java new file mode 100644 index 0000000..c11fb1d --- /dev/null +++ b/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyGoodsPersonController.java @@ -0,0 +1,84 @@ +package org.springblade.modules.business.contraller.supplies; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.springblade.common.cache.DeptCache; +import org.springblade.common.cache.UserCache; +import org.springblade.common.utils.LogUtil; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.mp.base.BaseEntity; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.CollectionUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.modules.business.pojo.dto.supplies.ApplyDTO; +import org.springblade.modules.business.pojo.entity.supplies.Apply; +import org.springblade.modules.business.pojo.entity.supplies.ApplyDetail; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPerson; +import org.springblade.modules.business.pojo.entity.supplies.Goods; +import org.springblade.modules.business.pojo.entity.workorder.WorkOrder; +import org.springblade.modules.business.service.IWorkOrderService; +import org.springblade.modules.business.service.supplies.IApplyDetailService; +import org.springblade.modules.business.service.supplies.IApplyGoodsPersonService; +import org.springblade.modules.business.service.supplies.IApplyService; +import org.springblade.modules.business.service.supplies.IGoodsService; +import org.springblade.modules.system.pojo.entity.Dept; +import org.springblade.modules.system.pojo.entity.User; +import org.springblade.modules.system.service.IDeptService; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 物品申领表 控制器 + * + * @author BladeX + * @since 2024-10-17 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/applyGoodsPerson") +public class ApplyGoodsPersonController extends BladeController { + + private final IApplyGoodsPersonService applyGoodsPersonService; + private final IGoodsService goodsService; + + + + + /** + * 物品申领表 分页 + */ + @GetMapping("/list") + public R> list(ApplyGoodsPerson applyGoodsPerson, Query query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(ApplyGoodsPerson.class); + wrapper.eq(ApplyGoodsPerson::getUserId,applyGoodsPerson.getUserId()); + IPage pages = applyGoodsPersonService.page(Condition.getPage(query), wrapper); + if(CollectionUtil.isNotEmpty(pages.getRecords())){ + pages.getRecords().forEach(item ->{ + Goods goods = goodsService.getOne(Wrappers.lambdaQuery(Goods.class).eq(Goods::getInventoryId,item.getProductCode()).eq(BaseEntity::getIsDeleted,0)); + item.setGoodsId(goods.getId()); + item.setBrand(goods.getBrand()); + item.setXh(goods.getXh()); + item.setUnit(goods.getUnit()); + item.setRule(goods.getRule()); + item.setRemark(goods.getRemark()); + }); + } + return R.data(pages); + } + +} diff --git a/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyGoodsPersonDetailController.java b/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyGoodsPersonDetailController.java new file mode 100644 index 0000000..67b7497 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyGoodsPersonDetailController.java @@ -0,0 +1,68 @@ +package org.springblade.modules.business.contraller.supplies; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import org.springblade.common.cache.SysCache; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.mp.base.BaseEntity; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.CollectionUtil; +import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTask; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPerson; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPersonDetail; +import org.springblade.modules.business.pojo.entity.workorder.WorkOrder; +import org.springblade.modules.business.service.IMaintenanceTaskService; +import org.springblade.modules.business.service.IWorkOrderService; +import org.springblade.modules.business.service.supplies.IApplyGoodsPersonDetailService; +import org.springblade.modules.business.service.supplies.IApplyGoodsPersonService; +import org.springblade.modules.system.pojo.entity.Dept; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 物品申领表 控制器 + * + * @author BladeX + * @since 2024-10-17 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/applyGoodsPersonDetail") +public class ApplyGoodsPersonDetailController extends BladeController { + + private final IApplyGoodsPersonDetailService applyGoodsPersonDetailService; + private final IWorkOrderService workOrderService; + private final IMaintenanceTaskService maintenanceTaskService; + + + /** + * 物品申领表 分页 + */ + @GetMapping("/list") + public R> list(ApplyGoodsPersonDetail applyGoodsPersonDetail, Query query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(ApplyGoodsPersonDetail.class); + wrapper.eq(ApplyGoodsPersonDetail::getProductCode,applyGoodsPersonDetail.getProductCode()); + IPage pages = applyGoodsPersonDetailService.page(Condition.getPage(query), wrapper); + if(CollectionUtil.isNotEmpty(pages.getRecords())){ + pages.getRecords().forEach(item ->{ + if("1".equals(item.getType())){ + WorkOrder workorder = workOrderService.getOne(Wrappers.lambdaQuery(WorkOrder.class).eq(BaseEntity::getId,item.getOrderId()).eq(BaseEntity::getIsDeleted,0)); + item.setRequirementCode(workorder.getRequirementCode()); + item.setRequirementUnit(SysCache.getDeptName(Long.parseLong(workorder.getReportUnit()))); + }else{ + MaintenanceTask task = maintenanceTaskService.getOne(Wrappers.lambdaQuery(MaintenanceTask.class).eq(BaseEntity::getId,item.getOrderId()).eq(BaseEntity::getIsDeleted,0)); + item.setRequirementCode(task.getTaskCode()); + item.setRequirementUnit(task.getDeptName()); + } + + }); + } + return R.data(pages); + } + +} diff --git a/src/main/java/org/springblade/modules/business/enums/MaintenanceStatusEnum.java b/src/main/java/org/springblade/modules/business/enums/MaintenanceStatusEnum.java index fa3de66..9a7c544 100644 --- a/src/main/java/org/springblade/modules/business/enums/MaintenanceStatusEnum.java +++ b/src/main/java/org/springblade/modules/business/enums/MaintenanceStatusEnum.java @@ -78,6 +78,26 @@ public enum MaintenanceStatusEnum { * 客服确认开发票 */ REPAIR_INVOICE(8), + + /** + * 客户确认维修效果 + */ + REPAIR_CUSTOMER_NORMAL_REPAIR_CONFIRM(9), + + /** + * 维修人员核销库存 + */ + REPAIR_SERVICEMAN_WRITE_OFF_INVENTORY(10), + + /** + * 维修主管进行神品 + */ + REPAIR_SUPERVISOR_APPROVE_INVENTORY(11), + + /** + * 库管员审批库存 + */ + REPAIR_STOREMAN_APPROVE_INVENTORY(12), ; final int value; diff --git a/src/main/java/org/springblade/modules/business/enums/WorkOrderStatusEnum.java b/src/main/java/org/springblade/modules/business/enums/WorkOrderStatusEnum.java index ef97ee4..0005f5b 100644 --- a/src/main/java/org/springblade/modules/business/enums/WorkOrderStatusEnum.java +++ b/src/main/java/org/springblade/modules/business/enums/WorkOrderStatusEnum.java @@ -41,7 +41,12 @@ public enum WorkOrderStatusEnum { /** * 客户确认维修效果 */ - KH_REPAIR_CONFIRM(105,"客户确认维修效果"), + KH_EMERGENCY_REPAIR_CONFIRM(105,"客户确认紧急维修效果"), + + /** + * 客户确认维修效果 + */ + KH_NORMAL_REPAIR_CONFIRM(106,"客户确认维修效果"), @@ -89,6 +94,11 @@ public enum WorkOrderStatusEnum { */ ZG_REPAIR_PLAN_PASS(301,"主管审批通过,待客户审批"), + /** + * 维修主管审批库存 + */ + ZG_APPROVE_INVENTORY(302,"维修主管审批库存"), + // ---------------------------------- 维修人员以4开头 /** * 维修人员拒绝工单, 待客服处理 @@ -125,6 +135,17 @@ public enum WorkOrderStatusEnum { * 维修人员补填维修方案 */ WX_REPAIR_PLAN_SUBMIT_AFTER(406,"维修人员补填维修方案"), + + /** + * 维修人员核销库存,待维修主管审批 + */ + WX_REPAIR_WRITE_OFF_INVENTORY(407,"维修人员核销库存,待维修主管审批"), + + // ---------------------------------- 库管员以5开头 + /** + * 库管员审批库存 + */ + KG_APPROVE_INVENTORY(501,"库管员审批库存"), ; final int value; diff --git a/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonDetailMapper.java b/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonDetailMapper.java new file mode 100644 index 0000000..0680a68 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonDetailMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 庄骞 (smallchill@163.com) + */ +package org.springblade.modules.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPerson; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPersonDetail; + +/** + * 物品申领表明细 Mapper 接口 + * + * @author BladeX + * @since 2024-10-17 + */ +public interface ApplyGoodsPersonDetailMapper extends BaseMapper { + + + +} diff --git a/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonDetailMapper.xml b/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonDetailMapper.xml new file mode 100644 index 0000000..99b3481 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonDetailMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonMapper.java b/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonMapper.java new file mode 100644 index 0000000..778ad41 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 庄骞 (smallchill@163.com) + */ +package org.springblade.modules.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPerson; + +/** + * 物品申领表明细 Mapper 接口 + * + * @author BladeX + * @since 2024-10-17 + */ +public interface ApplyGoodsPersonMapper extends BaseMapper { + + + +} diff --git a/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonMapper.xml b/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonMapper.xml new file mode 100644 index 0000000..275fef7 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/mapper/ApplyGoodsPersonMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/springblade/modules/business/pojo/dto/MaintenanceTaskDto.java b/src/main/java/org/springblade/modules/business/pojo/dto/MaintenanceTaskDto.java index f8fc8f3..0b775a5 100644 --- a/src/main/java/org/springblade/modules/business/pojo/dto/MaintenanceTaskDto.java +++ b/src/main/java/org/springblade/modules/business/pojo/dto/MaintenanceTaskDto.java @@ -51,4 +51,5 @@ public class MaintenanceTaskDto { * 总价 */ private Double totalPrice; + } diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/MaintenanceTaskDetailGoods.java b/src/main/java/org/springblade/modules/business/pojo/entity/MaintenanceTaskDetailGoods.java index 4e8701d..6ba690a 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/MaintenanceTaskDetailGoods.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/MaintenanceTaskDetailGoods.java @@ -3,6 +3,8 @@ package org.springblade.modules.business.pojo.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.NullSerializer; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.poi.hpsf.Decimal; @@ -40,5 +42,9 @@ public class MaintenanceTaskDetailGoods extends BaseEntity { private Long parentId; + //实际使用数量 + @JsonSerialize(nullsUsing = NullSerializer.class) + private Integer useNumber; + } diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTaskDetail.java b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTaskDetail.java index 4657912..02004bd 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTaskDetail.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTaskDetail.java @@ -148,4 +148,5 @@ public class MaintenanceTaskDetail extends BaseEntity { */ private String repairOption; + } diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/RepairGoodsOutputData.java b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/RepairGoodsOutputData.java index c0c238c..35f2d07 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/RepairGoodsOutputData.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/RepairGoodsOutputData.java @@ -23,4 +23,7 @@ public class RepairGoodsOutputData { private Double totalPrice; + //实际使用数量 + private Integer useNumber; + } diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyGoodsPerson.java b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyGoodsPerson.java new file mode 100644 index 0000000..86c32c3 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyGoodsPerson.java @@ -0,0 +1,83 @@ +package org.springblade.modules.business.pojo.entity.supplies; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 物品申领表明细 实体类 + * + * @author BladeX + * @since 2024-10-17 + */ +@Data +@TableName("lab_apply_goods_person") +@EqualsAndHashCode(callSuper = true) +public class ApplyGoodsPerson extends BaseEntity { + + /** + * + */ + private Long userId; + /** + * + */ + private String userName; + /** + * + */ + private String productCode; + + /** + * + */ + private String productName; + + /** + * + */ + private Integer num; + + + /** + * 单位 + */ + @TableField(exist = false) + private String unit; + + /** + * 物品型号 + */ + @TableField(exist = false) + private String xh; + + /** + * 品牌 + */ + @TableField(exist = false) + private String brand; + + /** + * 备注 + */ + @TableField(exist = false) + private String remark; + + /** + * 物品规格 + */ + @TableField(exist = false) + private String rule; + + /** + * 物品规格 + */ + @TableField(exist = false) + private long goodsId; +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyGoodsPersonDetail.java b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyGoodsPersonDetail.java new file mode 100644 index 0000000..7ef75f3 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyGoodsPersonDetail.java @@ -0,0 +1,65 @@ +package org.springblade.modules.business.pojo.entity.supplies; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 物品申领表明细 实体类 + * + * @author BladeX + * @since 2024-10-17 + */ +@Data +@TableName("lab_apply_goods_person_detail") +@EqualsAndHashCode(callSuper = true) +public class ApplyGoodsPersonDetail extends BaseEntity { + /** + * + */ + private Long orderId; + + /** + * + */ + private String type; + + /** + * + */ + private Long userId; + /** + * + */ + private String userName; + /** + * + */ + private String productCode; + + /** + * + */ + private String productName; + + /** + * + */ + private Integer num; + + + /** + * 需求单号 + */ + @TableField(exist = false) + private String requirementCode; + + /** + * 提报单位 + */ + @TableField(exist = false) + private String requirementUnit; + +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderFillData.java b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderFillData.java index 1ffe4ad..90b4b60 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderFillData.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderFillData.java @@ -20,4 +20,6 @@ public class WorkOrderFillData { private Double price; private Integer no; + + private Integer useCount; } diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderRepairMaterial.java b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderRepairMaterial.java index 4642772..e9a109f 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderRepairMaterial.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderRepairMaterial.java @@ -67,4 +67,10 @@ public class WorkOrderRepairMaterial extends BaseEntity { * 型号 */ private String xh; + + + /** + * 实际使用数量 + */ + private Integer useCount; } diff --git a/src/main/java/org/springblade/modules/business/pojo/vo/workorder/WorkOrderVO.java b/src/main/java/org/springblade/modules/business/pojo/vo/workorder/WorkOrderVO.java index eb1cc81..29f16b9 100644 --- a/src/main/java/org/springblade/modules/business/pojo/vo/workorder/WorkOrderVO.java +++ b/src/main/java/org/springblade/modules/business/pojo/vo/workorder/WorkOrderVO.java @@ -62,4 +62,7 @@ public class WorkOrderVO extends WorkOrder { * 评价意见 */ private String evaluationRemarks; + + + private String type; } diff --git a/src/main/java/org/springblade/modules/business/service/IWorkOrderService.java b/src/main/java/org/springblade/modules/business/service/IWorkOrderService.java index 0a6281f..6a762cf 100644 --- a/src/main/java/org/springblade/modules/business/service/IWorkOrderService.java +++ b/src/main/java/org/springblade/modules/business/service/IWorkOrderService.java @@ -102,4 +102,6 @@ public interface IWorkOrderService extends BaseService { public void batchReportService(List workOrder, HttpServletResponse response) throws IOException; public Map selectAverageFaultRepairTime(String startMonth, String endMonth); + + public void servicemanWriteOffInventory(WorkOrderVO workOrder); } diff --git a/src/main/java/org/springblade/modules/business/service/impl/MaintenanceTaskDetailServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/MaintenanceTaskDetailServiceImpl.java index c882b12..4259d0d 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/MaintenanceTaskDetailServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/MaintenanceTaskDetailServiceImpl.java @@ -413,6 +413,7 @@ public class MaintenanceTaskDetailServiceImpl extends BaseServiceImpl materials = workOrder.getMaterials(); + //更新物料信息 + workOrderRepairMaterialService.updateBatchById(materials); + //根据物料信息,核销维修人员库存 + for(WorkOrderRepairMaterial material : materials){ + ApplyGoodsPerson applyGoodsPerson = applyGoodsPersonService.getOne(Wrappers.lambdaQuery(ApplyGoodsPerson.class).eq(ApplyGoodsPerson::getProductCode,material.getInventoryId()).eq(ApplyGoodsPerson::getUserId,workOrder.getRepairPerson()).eq(BaseEntity::getIsDeleted,0)); + if(applyGoodsPerson != null){ + applyGoodsPerson.setNum(applyGoodsPerson.getNum() - material.getUseCount()); + applyGoodsPersonService.updateById(applyGoodsPerson); + ApplyGoodsPersonDetail applyGoodsPersonDetail = new ApplyGoodsPersonDetail(); + applyGoodsPersonDetail.setOrderId(workOrder.getId()); + applyGoodsPersonDetail.setType("1"); + applyGoodsPersonDetail.setUserId(applyGoodsPerson.getUserId()); + applyGoodsPersonDetail.setUserName(applyGoodsPerson.getUserName()); + applyGoodsPersonDetail.setProductCode(applyGoodsPerson.getProductCode()); + applyGoodsPersonDetail.setProductName(applyGoodsPerson.getProductName()); + applyGoodsPersonDetail.setNum(material.getUseCount()); + applyGoodsPersonDetailService.save(applyGoodsPersonDetail); + }else{ + throw new ServiceException("物料"+material.getMaterialName()+"库存不足,请申领后再核销!"); + } + } + + WorkOrder workOrderOld = baseMapper.selectById(workOrder.getId()); + workOrderOld.setStatus(WorkOrderStatusEnum.WX_REPAIR_WRITE_OFF_INVENTORY.getValue()); + workOrderOld.setTotalCost(workOrder.getTotalCost()); + workOrderOld.setDiscountPrice(workOrder.getDiscountPrice()); + workOrderOld.setTotalPrice(workOrder.getTotalPrice()); + //保存日志 + LogUtil.saveLog(workOrderOld.getRequirementCode(), WorkOrderStatusEnum.WX_REPAIR_WRITE_OFF_INVENTORY.getName()); + baseMapper.updateById(workOrderOld); + } + @Transactional(rollbackFor = Exception.class) @Override public void repairPlanRefuse(WorkOrder workOrder) { @@ -614,6 +660,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl implements IApplyGoodsPersonDetailService { + + +} diff --git a/src/main/java/org/springblade/modules/business/service/impl/supplies/ApplyGoodsPersonServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/supplies/ApplyGoodsPersonServiceImpl.java new file mode 100644 index 0000000..9c22680 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/service/impl/supplies/ApplyGoodsPersonServiceImpl.java @@ -0,0 +1,21 @@ +package org.springblade.modules.business.service.impl.supplies; + +import lombok.AllArgsConstructor; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.modules.business.mapper.ApplyGoodsPersonMapper; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPerson; +import org.springblade.modules.business.service.supplies.IApplyGoodsPersonService; +import org.springframework.stereotype.Service; + +/** + * 物品申领表明细 服务实现类 + * + * @author BladeX + * @since 2024-10-17 + */ +@Service +@AllArgsConstructor +public class ApplyGoodsPersonServiceImpl extends BaseServiceImpl implements IApplyGoodsPersonService { + + +} diff --git a/src/main/java/org/springblade/modules/business/service/supplies/IApplyGoodsPersonDetailService.java b/src/main/java/org/springblade/modules/business/service/supplies/IApplyGoodsPersonDetailService.java new file mode 100644 index 0000000..a45fd4d --- /dev/null +++ b/src/main/java/org/springblade/modules/business/service/supplies/IApplyGoodsPersonDetailService.java @@ -0,0 +1,15 @@ +package org.springblade.modules.business.service.supplies; + +import org.springblade.core.mp.base.BaseService; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPersonDetail; + +/** + * 维修人员物品表 服务类 + * + * @author BladeX + * @since 2024-10-17 + */ +public interface IApplyGoodsPersonDetailService extends BaseService { + + +} diff --git a/src/main/java/org/springblade/modules/business/service/supplies/IApplyGoodsPersonService.java b/src/main/java/org/springblade/modules/business/service/supplies/IApplyGoodsPersonService.java new file mode 100644 index 0000000..6e7be4b --- /dev/null +++ b/src/main/java/org/springblade/modules/business/service/supplies/IApplyGoodsPersonService.java @@ -0,0 +1,15 @@ +package org.springblade.modules.business.service.supplies; + +import org.springblade.core.mp.base.BaseService; +import org.springblade.modules.business.pojo.entity.supplies.ApplyGoodsPerson; + +/** + * 维修人员物品表 服务类 + * + * @author BladeX + * @since 2024-10-17 + */ +public interface IApplyGoodsPersonService extends BaseService { + + +} diff --git a/src/main/resources/excel/RepairService.xlsx b/src/main/resources/excel/RepairService.xlsx index 7c16921f4e02df1df7af6ff972f8880465542b4e..3264c83b5f3e76e1372a16d32d4813d9cde067c3 100644 GIT binary patch literal 12889 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 R0Pt@ws5d{YV)*Ub{{ZHKEkOVP diff --git a/src/main/resources/excel/WorkOrderServiceSheet.xlsx b/src/main/resources/excel/WorkOrderServiceSheet.xlsx index 41d56d1ac248f28929bd87b671d53cfd072e4aa2..da88c88272ad75d9e1ae69ae9f093654c9095cb3 100644 GIT binary patch delta 7205 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 delta 7082 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