From 9e221628c5cc94d09e2af631bc1e5fac4ca65cff Mon Sep 17 00:00:00 2001 From: sunjianxi <839419401@qq.com> Date: Thu, 13 Feb 2025 11:38:04 +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 --- .../org/springblade/common/utils/LogUtil.java | 20 ++-- .../business/config/ScheduledService.java | 13 +++ .../contraller/ApplyLogController.java | 42 ++++++++ .../business/contraller/DeviceController.java | 10 ++ .../contraller/MaintenanceController.java | 13 ++- .../contraller/WorkOrderController.java | 22 +++- .../contraller/supplies/ApplyController.java | 97 ++++++++++++++---- .../contraller/supplies/GoodsController.java | 3 +- .../business/mapper/ApplyLogMapper.java | 17 +++ .../business/mapper/ApplyLogMapper.xml | 9 ++ .../pojo/entity/supplies/ApplyLog.java | 31 ++++++ .../pojo/entity/workorder/WorkOrder.java | 10 ++ .../business/service/IApplyLogService.java | 16 +++ .../business/service/IMessageService.java | 3 + .../service/impl/ApplyLogServiceImpl.java | 23 +++++ .../impl/MaintenancePlanServiceImpl.java | 12 ++- .../service/impl/MessageServiceImpl.java | 16 +++ .../service/impl/WorkOrderServiceImpl.java | 15 +-- .../impl/supplies/ApplyDetailServiceImpl.java | 30 ++++++ .../impl/supplies/GoodsServiceImpl.java | 3 + .../service/supplies/IApplyDetailService.java | 2 + .../modules/business/sms/SmsService.java | 6 +- .../excel/WorkOrderServiceSheet.xlsx | Bin 11855 -> 11691 bytes 23 files changed, 368 insertions(+), 45 deletions(-) create mode 100644 src/main/java/org/springblade/modules/business/contraller/ApplyLogController.java create mode 100644 src/main/java/org/springblade/modules/business/mapper/ApplyLogMapper.java create mode 100644 src/main/java/org/springblade/modules/business/mapper/ApplyLogMapper.xml create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyLog.java create mode 100644 src/main/java/org/springblade/modules/business/service/IApplyLogService.java create mode 100644 src/main/java/org/springblade/modules/business/service/impl/ApplyLogServiceImpl.java diff --git a/src/main/java/org/springblade/common/utils/LogUtil.java b/src/main/java/org/springblade/common/utils/LogUtil.java index 83af0ad..c340c2e 100644 --- a/src/main/java/org/springblade/common/utils/LogUtil.java +++ b/src/main/java/org/springblade/common/utils/LogUtil.java @@ -33,7 +33,9 @@ import com.google.zxing.qrcode.QRCodeWriter; import lombok.AllArgsConstructor; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.DateUtil; +import org.springblade.modules.business.pojo.entity.supplies.ApplyLog; import org.springblade.modules.business.pojo.entity.workorder.WorkOrderLog; +import org.springblade.modules.business.service.IApplyLogService; import org.springblade.modules.business.service.IWorkOrderLogService; import org.springblade.modules.business.service.IWorkOrderService; @@ -50,13 +52,6 @@ import java.util.Base64; public class LogUtil { - /** - * 二维码生成(转base64) - * @param content - * @return - * @throws WriterException - * @throws IOException - */ public static void saveLog(String code,String content){ IWorkOrderLogService workOrderLogService = ApplicationContextUtil.getBean(IWorkOrderLogService.class); WorkOrderLog log = new WorkOrderLog(); @@ -67,4 +62,15 @@ public class LogUtil { log.setIsDeleted(0); workOrderLogService.save(log); } + + public static void saveApplyLog(String code,String content){ + IApplyLogService applyLogService = ApplicationContextUtil.getBean(IApplyLogService.class); + ApplyLog log = new ApplyLog(); + log.setCode(code); + log.setContent(content); + log.setCreateTime(DateUtil.now()); + log.setStatus(0); + log.setIsDeleted(0); + applyLogService.save(log); + } } diff --git a/src/main/java/org/springblade/modules/business/config/ScheduledService.java b/src/main/java/org/springblade/modules/business/config/ScheduledService.java index 9705ffc..03a2975 100644 --- a/src/main/java/org/springblade/modules/business/config/ScheduledService.java +++ b/src/main/java/org/springblade/modules/business/config/ScheduledService.java @@ -2,6 +2,8 @@ package org.springblade.modules.business.config; import lombok.extern.slf4j.Slf4j; import org.springblade.modules.business.service.IMaintenancePlanService; +import org.springblade.modules.business.service.supplies.IApplyDetailService; +import org.springblade.modules.business.service.supplies.IApplyService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -14,6 +16,8 @@ public class ScheduledService { @Autowired private IMaintenancePlanService maintenancePlanService; + @Autowired + private IApplyDetailService applyDetailService; /** * 每天零点生成新的巡查任务 @@ -23,4 +27,13 @@ public class ScheduledService { LocalDate now = LocalDate.now().minusDays(-5); maintenancePlanService.createTask(now); } + + /** + * 每天1点查询待归还的申领记录发送消息提醒 + */ + @Scheduled(cron = "0 0 1 * * ?") +// @Scheduled(cron = "0 0/1 * * * ? ") + private void sendApplyReturnMessage() { + applyDetailService.sendApplyReturnMessage(); + } } diff --git a/src/main/java/org/springblade/modules/business/contraller/ApplyLogController.java b/src/main/java/org/springblade/modules/business/contraller/ApplyLogController.java new file mode 100644 index 0000000..7d26323 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/contraller/ApplyLogController.java @@ -0,0 +1,42 @@ +package org.springblade.modules.business.contraller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.common.constant.CommonConstant; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.mp.base.BaseEntity; +import org.springblade.core.tool.api.R; +import org.springblade.modules.business.pojo.entity.supplies.ApplyLog; +import org.springblade.modules.business.service.IApplyLogService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 工单表 控制器 + * + * @author BladeX + * @since 2024-10-14 + */ +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping(CommonConstant.APPLICATION_PROJECT + "/apply-log") +public class ApplyLogController extends BladeController { + + private final IApplyLogService applyLogService; + + /** + * 工单列表 + */ + @GetMapping("/find-list-by-code") + public R> findListByCode(String code) { + List list = applyLogService.list(Wrappers.lambdaQuery(ApplyLog.class).eq(ApplyLog::getCode,code).eq(BaseEntity::getIsDeleted,0)); + return R.data(list); + } + + +} diff --git a/src/main/java/org/springblade/modules/business/contraller/DeviceController.java b/src/main/java/org/springblade/modules/business/contraller/DeviceController.java index fc7158a..85d8452 100644 --- a/src/main/java/org/springblade/modules/business/contraller/DeviceController.java +++ b/src/main/java/org/springblade/modules/business/contraller/DeviceController.java @@ -80,6 +80,16 @@ public class DeviceController extends BladeController { return R.data(deviceVO); } + /** + * 根据查询条件查询列表 + */ + @GetMapping("/findList") + @ApiOperationSupport(order = 1) + public R> findList(Device device) { + List list = deviceService.list(Condition.getQueryWrapper(device)); + return R.data(list); + } + /** * 设备表 分页 */ 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 9a4a2ba..996080e 100644 --- a/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java +++ b/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java @@ -9,6 +9,9 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.springblade.common.cache.SysCache; +import org.springblade.common.cache.UserCache; import org.springblade.common.constant.CommonConstant; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.base.BaseEntity; @@ -32,6 +35,7 @@ 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.springblade.modules.system.service.IUserService; +import org.springframework.beans.factory.annotation.Value; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -49,7 +53,7 @@ import java.util.stream.Collectors; * @author liuqingkun */ @RestController -@AllArgsConstructor +@RequiredArgsConstructor @RequestMapping(CommonConstant.APPLICATION_PROJECT + "/maintenance") @Tag(name = "维保控制器", description = "维控制器") public class MaintenanceController extends BladeController { @@ -64,6 +68,8 @@ public class MaintenanceController extends BladeController { private final IMessageService messageService; private final IUserService userService; private final IDeptService deptService; + @Value("${sms.template-id2}") + private String templateCode; /*---------- 维修计划开始 ----------*/ @@ -173,7 +179,10 @@ public class MaintenanceController extends BladeController { taskOld.setServicemanName(task.getServicemanName()); taskOld.setTaskStatus(MaintenanceStatusEnum.TASK_SUPERVISOR_CONFIRM.getValue()); taskService.updateById(taskOld); - smsService.sendSms("15053473693", "张迪"); + User user = UserCache.getUser(task.getServicemanId()); + if(StringUtils.isNotEmpty(user.getPhone())){ + smsService.sendSms(user.getPhone(), user.getRealName(),templateCode); + } return R.success(); } 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 1ea1e70..6c5b173 100644 --- a/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java +++ b/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java @@ -4,6 +4,7 @@ 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 com.mysql.cj.log.Log; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; @@ -285,7 +286,7 @@ public class WorkOrderController extends BladeController { WorkOrder workOrderOld = workOrderService.getById(workOrder.getId()); workOrderOld.setRepairPerson(workOrder.getRepairPerson()); workOrderOld.setDispatchTime(DateUtil.now()); - workOrderOld.setPlanCompleteTime(workOrder.getPlanCompleteTime()); + workOrderOld.setExpectCompleteTime(workOrder.getExpectCompleteTime()); workOrderOld.setRemark(workOrder.getRemark()); workOrderOld.setCustomerOpinion(workOrder.getCustomerOpinion()); workOrderOld.setStatus(WorkOrderStatusEnum.KF_ORDER_ALLOT.getValue()); @@ -697,4 +698,23 @@ public class WorkOrderController extends BladeController { workOrderService.batchReportService(workOrderList, response); } + + /** + * 删除 + */ + @PostMapping("/remove") + public R remove(@RequestParam String ids) { + return R.status(workOrderService.deleteLogic(Func.toLongList(ids))); + } + + /** + * 维修人员撤回维修方案 + */ + @ApiLog(value = "提报管理-维修人员撤回维修方案") + @PostMapping("/return") + public R update(@RequestBody WorkOrder workOrder) { + workOrderService.updateById(workOrder); + LogUtil.saveLog(workOrder.getRequirementCode(),"维修人员撤回维修方案。"); + return R.status(true); + } } 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 5a2b362..d7f65d2 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 @@ -10,6 +10,7 @@ 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; @@ -35,7 +36,9 @@ 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; /** @@ -133,29 +136,51 @@ public class ApplyController extends BladeController { @PostMapping("/save") @ApiOperationSupport(order = 4) public R save(@Valid @RequestBody ApplyDTO apply) { -// User user = UserCache.getUser(AuthUtil.getUserId()); - List details = apply.getDetails(); -// apply.setApplyTime(new Date()); -// apply.setApplyUserId(user.getId());0 -// apply.setApplyUser(user.getRealName()); - apply.setIsUpdate(-1); - apply.setCode("SL-" + DateFormatUtils.format(new Date(),"yyyyMMddHHmmss")); - apply.setApplyTypeNum(details.size()); - long count = details.stream().filter(applyDetail -> applyDetail.getReturnTime() != null).count(); - apply.setIsReturn(count > 0 ? 1 : 0); - boolean save = applyService.save(apply); + if(apply.getId() == null){ + List details = apply.getDetails(); + apply.setIsUpdate(-1); + apply.setCode("SL-" + DateFormatUtils.format(new Date(),"yyyyMMddHHmmss")); + apply.setApplyTypeNum(details.size()); + long count = details.stream().filter(applyDetail -> applyDetail.getReturnTime() != null).count(); + apply.setIsReturn(count > 0 ? 1 : 0); + boolean save = applyService.save(apply); - if (CollectionUtil.isNotEmpty(details)) { - for (ApplyDetail applyDetail : details) { - applyDetail.setApplyId(apply.getId()); - applyDetail.setIsCk(0); - applyDetail.setReturnNum(0); - applyDetail.setOutNum(0); - applyDetail.setIsReturn(applyDetail.getReturnTime() != null ? 1 : 0); + if (CollectionUtil.isNotEmpty(details)) { + for (ApplyDetail applyDetail : details) { + applyDetail.setApplyId(apply.getId()); + applyDetail.setIsCk(0); + applyDetail.setReturnNum(0); + applyDetail.setOutNum(0); + applyDetail.setIsReturn(applyDetail.getReturnTime() != null ? 1 : 0); + } + applyDetailService.saveBatch(details); + } + LogUtil.saveApplyLog(apply.getCode(),AuthUtil.getNickName()+"新增申领记录!"); + }else{ + List details = apply.getDetails(); + apply.setIsUpdate(-1); + apply.setApplyTypeNum(details.size()); + long count = details.stream().filter(applyDetail -> applyDetail.getReturnTime() != null).count(); + apply.setIsReturn(count > 0 ? 1 : 0); + applyService.updateById(apply); + if (CollectionUtil.isNotEmpty(details)) { + //申领明细全删全增 + Map map = new HashMap<>(); + map.put("apply_id",apply.getId()); + applyDetailService.removeByMap(map); + for (ApplyDetail applyDetail : details) { + applyDetail.setApplyId(apply.getId()); + applyDetail.setIsCk(0); + applyDetail.setReturnNum(0); + applyDetail.setOutNum(0); + applyDetail.setIsReturn(applyDetail.getReturnTime() != null ? 1 : 0); + } + applyDetailService.saveBatch(details); } - applyDetailService.saveBatch(details); + LogUtil.saveApplyLog(apply.getCode(),AuthUtil.getNickName()+"重新提交申领记录!"); } - return R.status(save); + + return R.status(true); } /** @@ -177,6 +202,28 @@ public class ApplyController extends BladeController { apply.setApproveUserId(user.getId()); apply.setApproveUser(user.getRealName()); apply.setApproveTime(new Date()); + if(apply.getStatus() == 1){ + List detailList = applyDetailService.list(Wrappers.lambdaQuery(ApplyDetail.class).eq(ApplyDetail::getApplyId,apply.getId()).eq(BaseEntity::getIsDeleted,0)); + List ids = detailList.stream().map(ApplyDetail::getProductId).collect(Collectors.toList()); + List goodsList = goodsService.listByIds(ids); + if (CollectionUtil.isNotEmpty(goodsList)) { + for (Goods goods : goodsList) { + for (ApplyDetail applyDetail : detailList) { + if (goods.getId().equals(applyDetail.getProductId())) { + int i = goods.getNum() - applyDetail.getApplyNum(); + goods.setNum(Math.max(i, 0)); + break; + } + } + } + goodsService.updateBatchById(goodsList); + } + LogUtil.saveApplyLog(apply.getCode(),user.getRealName()+"审批通过!"); + }else{ + LogUtil.saveApplyLog(apply.getCode(),user.getRealName()+"审批驳回!"); + } + + return R.status(applyService.updateById(apply)); } @@ -189,7 +236,7 @@ public class ApplyController extends BladeController { apply.setStatus(apply.getIsReturn() == 1 ? 3 : 2); apply.setCkTime(new Date()); List detailList = apply.getDetails(); - List ids = detailList.stream().map(ApplyDetail::getProductId).collect(Collectors.toList()); + /* List ids = detailList.stream().map(ApplyDetail::getProductId).collect(Collectors.toList()); List goodsList = goodsService.listByIds(ids); if (CollectionUtil.isNotEmpty(goodsList)) { for (Goods goods : goodsList) { @@ -205,11 +252,18 @@ public class ApplyController extends BladeController { } } goodsService.updateBatchById(goodsList); + }*/ + + for (ApplyDetail applyDetail : detailList) { + applyDetail.setIsCk(1); + applyDetail.setCkTime(new Date()); + applyDetail.setOutNum(applyDetail.getApplyNum()); } if (CollectionUtil.isNotEmpty(detailList)) { applyDetailService.updateBatchById(detailList); } + LogUtil.saveApplyLog(apply.getCode(),AuthUtil.getNickName()+"领取物资出库!"); return R.status(applyService.updateById(apply)); } @@ -239,6 +293,7 @@ public class ApplyController extends BladeController { if (CollectionUtil.isNotEmpty(detailList)) { applyDetailService.updateBatchById(detailList); } + LogUtil.saveApplyLog(apply.getCode(),AuthUtil.getNickName()+"归还物资!"); return R.status(applyService.updateById(apply)); } diff --git a/src/main/java/org/springblade/modules/business/contraller/supplies/GoodsController.java b/src/main/java/org/springblade/modules/business/contraller/supplies/GoodsController.java index 4e613e9..0b10901 100644 --- a/src/main/java/org/springblade/modules/business/contraller/supplies/GoodsController.java +++ b/src/main/java/org/springblade/modules/business/contraller/supplies/GoodsController.java @@ -59,7 +59,7 @@ public class GoodsController extends BladeController { Goods detail = goodsService.getById(goods.getId()); detail.setBigClassName(DictBizCache.getValue(GOODS_TYPE, detail.getBigClassId())); detail.setTypeName(DictBizCache.getValue(MAJOR_TYPE, detail.getType())); - detail.setInventoryPrice(detail.getPurchasePrice() != null ? 0.00 : detail.getNum() * detail.getPurchasePrice()); + detail.setInventoryPrice(detail.getPurchasePrice() == null ? 0.00 : detail.getNum() * detail.getPurchasePrice()); return R.data(detail); } @@ -108,6 +108,7 @@ public class GoodsController extends BladeController { @PostMapping("/update") @ApiOperationSupport(order = 5) public R update(@RequestBody Goods goods) { + return R.status(goodsService.updateById(goods)); } diff --git a/src/main/java/org/springblade/modules/business/mapper/ApplyLogMapper.java b/src/main/java/org/springblade/modules/business/mapper/ApplyLogMapper.java new file mode 100644 index 0000000..e703d12 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/mapper/ApplyLogMapper.java @@ -0,0 +1,17 @@ + +package org.springblade.modules.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springblade.modules.business.pojo.entity.supplies.ApplyLog; +import org.springblade.modules.business.pojo.entity.workorder.WorkOrderLog; + +/** + * 申领日志表 Mapper 接口 + * + * @author BladeX + * @since 2024-10-14 + */ +public interface ApplyLogMapper extends BaseMapper { + + +} diff --git a/src/main/java/org/springblade/modules/business/mapper/ApplyLogMapper.xml b/src/main/java/org/springblade/modules/business/mapper/ApplyLogMapper.xml new file mode 100644 index 0000000..9059492 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/mapper/ApplyLogMapper.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyLog.java b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyLog.java new file mode 100644 index 0000000..652b181 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/ApplyLog.java @@ -0,0 +1,31 @@ +package org.springblade.modules.business.pojo.entity.supplies; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +/** + * 申领日志表 实体类 + * + * @author BladeX + * @since 2024-10-14 + */ +@Data +@TableName("lab_apply_log") +@EqualsAndHashCode(callSuper = true) +public class ApplyLog extends BaseEntity { + + /** + * 申领单号 + */ + private String code; + + + /** + * 备注 + */ + private String content; + + +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrder.java b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrder.java index 9bbaa6f..0dca8b5 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrder.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrder.java @@ -271,4 +271,14 @@ public class WorkOrder extends BaseEntity { * 维修完成图片url */ private String completeImgList; + + /** + * 总费用 + */ + private Double totalCost; + + /** + * 预期完成时间 + */ + private Date expectCompleteTime; } diff --git a/src/main/java/org/springblade/modules/business/service/IApplyLogService.java b/src/main/java/org/springblade/modules/business/service/IApplyLogService.java new file mode 100644 index 0000000..49db802 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/service/IApplyLogService.java @@ -0,0 +1,16 @@ +package org.springblade.modules.business.service; + +import org.springblade.core.mp.base.BaseService; +import org.springblade.modules.business.pojo.entity.supplies.ApplyLog; +import org.springblade.modules.business.pojo.entity.workorder.WorkOrderLog; + +/** + * 申领日志表 服务类 + * + * @author BladeX + * @since 2024-10-14 + */ +public interface IApplyLogService extends BaseService { + + +} diff --git a/src/main/java/org/springblade/modules/business/service/IMessageService.java b/src/main/java/org/springblade/modules/business/service/IMessageService.java index e3bea40..6a55506 100644 --- a/src/main/java/org/springblade/modules/business/service/IMessageService.java +++ b/src/main/java/org/springblade/modules/business/service/IMessageService.java @@ -21,4 +21,7 @@ public interface IMessageService extends BaseService { void updateMessageStatus(Long id, Integer status); void updateMessageStatusAll(); + + + void saveApplyReturnMessage(String code, String content, Long messageUser, Integer messageType); } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ApplyLogServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ApplyLogServiceImpl.java new file mode 100644 index 0000000..54709d0 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/service/impl/ApplyLogServiceImpl.java @@ -0,0 +1,23 @@ +package org.springblade.modules.business.service.impl; + +import lombok.AllArgsConstructor; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.modules.business.mapper.ApplyLogMapper; +import org.springblade.modules.business.mapper.WorkOrderLogMapper; +import org.springblade.modules.business.pojo.entity.supplies.ApplyLog; +import org.springblade.modules.business.pojo.entity.workorder.WorkOrderLog; +import org.springblade.modules.business.service.IApplyLogService; +import org.springblade.modules.business.service.IWorkOrderLogService; +import org.springframework.stereotype.Service; + +/** + * 申领日志表 服务实现类 + * + * @author BladeX + * @since 2024-10-14 + */ +@Service +@AllArgsConstructor +public class ApplyLogServiceImpl extends BaseServiceImpl implements IApplyLogService { + +} diff --git a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java index 339b9a1..ae4b90c 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; @@ -26,6 +27,7 @@ import org.springblade.modules.business.sms.SmsService; import org.springblade.modules.resource.pojo.entity.Sms; import org.springblade.modules.system.pojo.entity.User; import org.springblade.modules.system.service.IUserService; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -45,7 +47,7 @@ import static org.springblade.common.constant.CommonConstant.*; * @since 2024-10-14 */ @Service -@AllArgsConstructor +@RequiredArgsConstructor public class MaintenancePlanServiceImpl extends BaseServiceImpl implements IMaintenancePlanService { private final IMaintenancePlanDetailService planDetailService; @@ -54,6 +56,8 @@ public class MaintenancePlanServiceImpl extends BaseServiceImplupdate().lambda().set(User::getIsMaintenanceClient, 1).like(User::getDeptId, plan.getDeptId()).eq(User::getIsMaintenanceClient, 0)); + userService.update(Wrappers.update().lambda().set(User::getIsMaintenanceClient, 1).like(User::getDeptId, plan.getDeptId()).eq(User::getIsMaintenanceClient, 0)); } return save; } @@ -307,9 +311,9 @@ public class MaintenancePlanServiceImpl extends BaseServiceImpl realName = Optional.ofNullable(maintenanceSupervisor.getRealName()); //TODO 当真实姓名为空时需要处理的逻辑 if (realName.isEmpty()) { - smsService.sendSms(maintenanceSupervisor.getPhone(), "未实名"); + smsService.sendSms(maintenanceSupervisor.getPhone(), "未实名" , templateCode); } else { - smsService.sendSms(maintenanceSupervisor.getPhone(), realName.get()); + smsService.sendSms(maintenanceSupervisor.getPhone(), realName.get(), templateCode); } } } catch (Exception e) { diff --git a/src/main/java/org/springblade/modules/business/service/impl/MessageServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/MessageServiceImpl.java index 7ba1301..f4936f2 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/MessageServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/MessageServiceImpl.java @@ -129,4 +129,20 @@ public class MessageServiceImpl extends BaseServiceImpl updateWrapper.eq("is_read", 0).set("is_read", 1); baseMapper.update(updateWrapper); } + + @Override + public void saveApplyReturnMessage(String code, String content, Long messageUser, Integer messageType) { + Message saveInformation = new Message(); + saveInformation.setRequirementCode(code); + saveInformation.setSystemType("1"); + saveInformation.setTitle("申领单"); + saveInformation.setContent(content); + saveInformation.setMessageUser(messageUser); + saveInformation.setTenantId("000000"); + saveInformation.setLevel(1); + saveInformation.setMethod(2); + saveInformation.setIsRead(0); + saveInformation.setMessageType(messageType); + this.save(saveInformation); + } } diff --git a/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java index bb49e5c..e65f66b 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java @@ -300,6 +300,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl map = new HashMap<>(); double total = workOrder.getTotalPrice(); + double totalCost = workOrder.getTotalCost(); FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); List workOrderRepairMaterialList = workOrderRepairMaterialService.list(Wrappers.lambdaQuery(WorkOrderRepairMaterial.class).eq(WorkOrderRepairMaterial::getOrderId, workOrder.getId())); List workOrderFillDataList = new ArrayList<>(); @@ -676,7 +678,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl limsId = Optional.ofNullable(device.get().getLimsId()); if (limsId.isPresent()) { - map.put("in", String.format("%.2f",(workOrder.getDiscountPrice() != null ? discountPrice.doubleValue() : 0.0) + (workOrder.getLaborCost() == null ? 0 : workOrder.getLaborCost()))); + map.put("in", totalCost); map.put("out", "--"); map.put("sel1", "√"); map.put("sel2", null); @@ -684,7 +686,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl map = new HashMap<>(); double total = workOrder.getTotalPrice(); + double totalCost = workOrder.getTotalCost(); FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); List workOrderRepairMaterialList = workOrderRepairMaterialService.list(Wrappers.lambdaQuery(WorkOrderRepairMaterial.class).eq(WorkOrderRepairMaterial::getOrderId, workOrder.getId())); List workOrderFillDataList = new ArrayList<>(); @@ -802,21 +805,21 @@ public class WorkOrderServiceImpl extends BaseServiceImpl limsId = Optional.ofNullable(device.get().getLimsId()); if (limsId.isPresent()) { - map.put("in", String.format("%.2f",workOrder.getDiscountPrice() + (workOrder.getLaborCost() != null ? workOrder.getLaborCost() : 0))); + map.put("in", totalCost); map.put("out", "--"); map.put("sel1", "√"); map.put("sel2", null); map.put("inTravel", workOrder.getTravelExpense()); } else { map.put("in", "--"); - map.put("out", String.format("%.2f",total + (workOrder.getLaborCost() != null ? workOrder.getLaborCost() : 0))); + map.put("out", totalCost); map.put("sel2", "√"); map.put("sel1", null); map.put("outTravel", workOrder.getTravelExpense()); } } else { map.put("in", "--"); - map.put("out", String.format("%.2f",total + (workOrder.getLaborCost() != null ? workOrder.getLaborCost() : 0))); + map.put("out", totalCost); map.put("sel2", "√"); map.put("sel1", null); map.put("outTravel", workOrder.getTravelExpense()); diff --git a/src/main/java/org/springblade/modules/business/service/impl/supplies/ApplyDetailServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/supplies/ApplyDetailServiceImpl.java index 4897f2c..47ad509 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/supplies/ApplyDetailServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/supplies/ApplyDetailServiceImpl.java @@ -2,15 +2,28 @@ package org.springblade.modules.business.service.impl.supplies; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.time.DateFormatUtils; +import org.apache.commons.lang.time.DateUtils; +import org.apache.commons.lang3.StringUtils; +import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.utils.CollectionUtil; +import org.springblade.modules.business.mapper.ApplyMapper; +import org.springblade.modules.business.pojo.entity.supplies.Apply; import org.springblade.modules.business.pojo.entity.supplies.ApplyDetail; import org.springblade.modules.business.excel.supplies.ApplyDetailExcel; import org.springblade.modules.business.mapper.ApplyDetailMapper; +import org.springblade.modules.business.service.IMessageService; import org.springblade.modules.business.service.supplies.IApplyDetailService; import org.springblade.modules.business.pojo.vo.supplies.ApplyDetailVO; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 物品申领表明细 服务实现类 @@ -19,8 +32,12 @@ import java.util.List; * @since 2024-10-17 */ @Service +@AllArgsConstructor public class ApplyDetailServiceImpl extends BaseServiceImpl implements IApplyDetailService { + private final IMessageService messageService; + private final ApplyMapper applyMapper; + @Override public IPage selectApplyDetailPage(IPage page, ApplyDetailVO applyDetail) { return page.setRecords(baseMapper.selectApplyDetailPage(page, applyDetail)); @@ -36,4 +53,17 @@ public class ApplyDetailServiceImpl extends BaseServiceImpl list = baseMapper.selectList(Wrappers.lambdaQuery(ApplyDetail.class).eq(ApplyDetail::getIsReturn,0).eq(BaseEntity::getIsDeleted,0).like(ApplyDetail::getReturnTime,tomorrow)); + if(CollectionUtil.isNotEmpty(list)){ + for(ApplyDetail applyDetail : list){ + Apply apply = applyMapper.selectOne(Wrappers.lambdaQuery(Apply.class).eq(Apply::getId,applyDetail.getApplyId()).eq(BaseEntity::getIsDeleted,0)); + messageService.saveApplyReturnMessage(apply.getCode(),"您申领单号【"+apply.getCode()+"】有待归还物品即将到期,请及时归还",apply.getApplyUserId(),4); + } + } + } + } diff --git a/src/main/java/org/springblade/modules/business/service/impl/supplies/GoodsServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/supplies/GoodsServiceImpl.java index 2d44835..2793e69 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/supplies/GoodsServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/supplies/GoodsServiceImpl.java @@ -77,6 +77,9 @@ public class GoodsServiceImpl extends BaseServiceImpl implem //根据inventoryId查询是否已存在 Goods oldGoods = baseMapper.selectOne(Wrappers.lambdaQuery(Goods.class).eq(Goods::getInventoryId,goods.getInventoryId()).eq(BaseEntity::getIsDeleted,0)); if(oldGoods != null){ + if(!oldGoods.getName().equals(goods.getName())){ + throw new ServiceException("库存id为"+goods.getInventoryId()+"的物品名称与系统中物品名称不一致,请重新确认后再导入!"); + } goods.setId(oldGoods.getId()); goods.setNum(goods.getNum() + oldGoods.getNum()); goods.setAllEnterNum(goods.getNum() + oldGoods.getAllEnterNum()); diff --git a/src/main/java/org/springblade/modules/business/service/supplies/IApplyDetailService.java b/src/main/java/org/springblade/modules/business/service/supplies/IApplyDetailService.java index 7cc5295..faa724a 100644 --- a/src/main/java/org/springblade/modules/business/service/supplies/IApplyDetailService.java +++ b/src/main/java/org/springblade/modules/business/service/supplies/IApplyDetailService.java @@ -34,4 +34,6 @@ public interface IApplyDetailService extends BaseService { */ List exportApplyDetail(Wrapper queryWrapper); + void sendApplyReturnMessage(); + } diff --git a/src/main/java/org/springblade/modules/business/sms/SmsService.java b/src/main/java/org/springblade/modules/business/sms/SmsService.java index 393ff28..c8f7299 100644 --- a/src/main/java/org/springblade/modules/business/sms/SmsService.java +++ b/src/main/java/org/springblade/modules/business/sms/SmsService.java @@ -33,10 +33,10 @@ public class SmsService { @Value("${sms.sign-name}") private String signName; - @Value("${sms.template-id1}") - private String templateCode; +// @Value("${sms.template-id1}") +// private String templateCode; - public void sendSms(String phoneNumber, String name) throws ClientException { + public void sendSms(String phoneNumber, String name, String templateCode) throws ClientException { SendSmsRequest request = new SendSmsRequest(); // 设置短信模板的参数 diff --git a/src/main/resources/excel/WorkOrderServiceSheet.xlsx b/src/main/resources/excel/WorkOrderServiceSheet.xlsx index d1532c9bf6304d7c53216334ee83a65f725a52d9..41d56d1ac248f28929bd87b671d53cfd072e4aa2 100644 GIT binary patch delta 6782 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 Sv4KXNk;y}dA;|qN`hNhRkV!WH