diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/common/RecordTypeEnum.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/common/RecordTypeEnum.java index df353a01..59134dcb 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/common/RecordTypeEnum.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/common/RecordTypeEnum.java @@ -91,7 +91,9 @@ public enum RecordTypeEnum { NFPG("nfpg", "内返派工"), /** 收款*/ SK("sk", "收款"), - PICKCAR("pickcar", "接车"); + PICKCAR("pickcar", "接车"), + JSSQ("jssq", "结算申请"), + JSSP("jssp", "结算审批"); /** * code diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/common/RepairDictConstants.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/common/RepairDictConstants.java index c541d183..e72ba81b 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/common/RepairDictConstants.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/common/RepairDictConstants.java @@ -34,4 +34,7 @@ public interface RepairDictConstants { /** 调拨状态 */ String REPAIR_ST_STATUS = "repair_st_status"; + + /** 基础业务配置 */ + String BASE_BUSINESS_CONFIG = "base_business_config"; } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/entity/RepairRecords.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/entity/RepairRecords.java index 6b9e0de5..0ac425f0 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/entity/RepairRecords.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/entity/RepairRecords.java @@ -50,4 +50,9 @@ public class RepairRecords extends TenantBaseDO { */ private Long dealUserId; + /** + * 冗余字段 + */ + private String otherData; + } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/RepairRecordsService.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/RepairRecordsService.java index 73d7589a..5c9e2899 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/RepairRecordsService.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/RepairRecordsService.java @@ -28,6 +28,16 @@ public interface RepairRecordsService extends IService { **/ void saveRepairRecord(String ticketId, String repairItemId, String type, String remark, String images); + /** + * @Author 许 + * @Description 保存维修记录 + * @Date 13:38 2025/8/20 + * @Param [ticketId, repairItemId, type, remark, images, otherData] + * @return void + **/ + + void saveRepairRecord(String ticketId, String repairItemId, String type, String remark, String images, String otherData); + /** * 根据条件查询维修记录 * @author PQZ diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/impl/RepairRecordsServiceImpl.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/impl/RepairRecordsServiceImpl.java index fde8d479..d36fbab5 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/impl/RepairRecordsServiceImpl.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/impl/RepairRecordsServiceImpl.java @@ -76,6 +76,33 @@ public class RepairRecordsServiceImpl extends ServiceImpl setTicketsPaid(@RequestBody DlRepairTicketsRespVO repairTicketsRespVO) { dlRepairTicketsService.setTicketsPaid(repairTicketsRespVO); return CommonResult.ok(); } + /** + * 维修工单表 结算 + * + * @param vo 工单 + * @author 小李 + * @date 8:50 2024/9/23 + **/ + @PostMapping("/settlement") + @Operation(summary = "维修工单表 结算") + public CommonResult setTicketsSettlement(@RequestBody TicketsSettlementVO vo) { + dlRepairTicketsService.setTicketsSettlement(vo); + return CommonResult.ok(); + } + + /** + * @Author 许 + * @Description 结算审批 + * @Date 13:43 2025/8/20 + * @Param [vo] + * @return cn.iocoder.yudao.framework.common.pojo.CommonResult + **/ + + @PostMapping("/settlementReview") + @Operation(summary = "维修工单表 结算") + public CommonResult settlementReview(@RequestBody TicketsSettlementVO vo) { + dlRepairTicketsService.settlementReview(vo); + return CommonResult.ok(); + } + + /** + * @Author 许 + * @Description 查询审批金额 + * @Date 14:20 2025/8/20 + * @Param [repairTicketsReqVO] + * @return cn.iocoder.yudao.framework.common.pojo.CommonResult + **/ + @GetMapping("/getSettlement") + public CommonResult getSettlement(DlRepairTicketsReqVO repairTicketsReqVO) { + return CommonResult.success(dlRepairTicketsService.getSettlement(repairTicketsReqVO)); + } + // /** // * 维修工单表 导出 // * @@ -601,11 +647,15 @@ public class DlRepairTicketsController { String profitRateWithLabor = statistics.get("profitRateWithLabor") != null ? formatPercentage(statistics.get("profitRateWithLabor").toString()) : "0%"; String profitRateWithoutLabor = statistics.get("profitRateWithoutLabor") != null ? formatPercentage(statistics.get("profitRateWithoutLabor").toString()) : "0%"; - rows.add(CollUtil.newArrayList( - "产值:", totalLaborPartsMoney, - "毛利:", totalProfit, - "含工时毛利率:", profitRateWithLabor, - "不含工时毛利率:", profitRateWithoutLabor)); + + boolean hasAnyPermissions = permissionApi.hasAnyPermissions(SecurityFrameworkUtils.getLoginUserId(), "repair:tick:profit"); + if (hasAnyPermissions) { + rows.add(CollUtil.newArrayList( + "产值:", totalLaborPartsMoney, + "毛利:", totalProfit, + "含工时毛利率:", profitRateWithLabor, + "不含工时毛利率:", profitRateWithoutLabor)); + } // 第二行写表头 rows.add(CollUtil.newArrayList("订单编号","维修类别", "客户名称", "车牌号", "车系", "手机号", "经办人姓名", "经办人电话")); diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTickets.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTickets.java index 68e7181a..72b11781 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTickets.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTickets.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.tickets.entity; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; +import cn.iocoder.yudao.module.tickets.vo.TicketsSettlementVO; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -249,6 +250,9 @@ public class DlRepairTickets extends TenantBaseDO { /** 商业险保费 */ private BigDecimal shangye; + /** 支付状态 字典(repair_pat_status) */ + private String payStatus; + /** 更新时上传的图片 */ @TableField(exist = false) private String image; @@ -258,4 +262,8 @@ public class DlRepairTickets extends TenantBaseDO { /** 支付方式文本 */ @TableField(exist = false) private String payTypeText; + @TableField(exist = false) + private String settlementStr; + @TableField(exist = false) + private TicketsSettlementVO settlement; } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java index e3d2fb24..4a9f62da 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java @@ -1,10 +1,7 @@ package cn.iocoder.yudao.module.tickets.service; import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets; -import cn.iocoder.yudao.module.tickets.vo.CustomerAndCarVO; -import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsReqVO; -import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO; -import cn.iocoder.yudao.module.tickets.vo.NoticeCusVO; +import cn.iocoder.yudao.module.tickets.vo.*; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -291,4 +288,34 @@ public interface DlRepairTicketsService extends IService { **/ Map getStatistics(DlRepairTicketsReqVO repairTicketsReqVO); + + /** + * @Author 许 + * @Description 结算申请 + * @Date 10:12 2025/8/20 + * @Param [repairTicketsRespVO] + * @return void + **/ + + void setTicketsSettlement(TicketsSettlementVO repairTicketsRespVO); + + /** + * @Author 许 + * @Description 结算审批 + * @Date 13:41 2025/8/20 + * @Param [vo] + * @return void + **/ + + void settlementReview(TicketsSettlementVO vo); + + /** + * @Author 许 + * @Description 查询审批金额 + * @Date 14:20 2025/8/20 + * @Param [repairTicketsReqVO] + * @return cn.iocoder.yudao.module.tickets.vo.TicketsSettlementVO + **/ + + TicketsSettlementVO getSettlement(DlRepairTicketsReqVO repairTicketsReqVO); } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java index 4b29b4dd..729aa381 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java @@ -65,6 +65,7 @@ import cn.iocoder.yudao.module.tickets.utils.TicketsOperateUtil; import cn.iocoder.yudao.module.tickets.vo.*; import cn.iocoder.yudao.util.CreateQRCodeUtil; import cn.iocoder.yudao.util.SendSmsUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -97,6 +98,7 @@ import java.util.stream.Collectors; import static cn.iocoder.yudao.common.BaseConstants.ORDER_TENANT_NAME; import static cn.iocoder.yudao.common.RepairCons.*; +import static cn.iocoder.yudao.common.RepairDictConstants.BASE_BUSINESS_CONFIG; import static cn.iocoder.yudao.common.RepairDictConstants.REPAIR_WORK_TYPE; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0; @@ -389,7 +391,14 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO, Page page) { - return baseMapper.getTicketsPage(repairTicketsReqVO, page); + IPage ticketsPage = baseMapper.getTicketsPage(repairTicketsReqVO, page); + ticketsPage.getRecords().forEach(item -> { + if (ObjectUtil.isNotEmpty(item.getSettlementStr())) { + // 将json字符串转换成对象 + item.setSettlement(JSON.parseObject(item.getSettlementStr(), TicketsSettlementVO.class)); + } + }); + return ticketsPage; } /** @@ -685,7 +694,6 @@ public class DlRepairTicketsServiceImpl extends ServiceImpllambdaQuery() + .eq(RepairRecords::getTicketId, repairTicketsRespVO.getId()) + .eq(RepairRecords::getType, RecordTypeEnum.JSSP) + .orderByDesc(RepairRecords::getCreateTime) + .last("limit 1")); + + // 提取冗余字段 + String otherData = record.getOtherData(); + // 将json 转为对象 + TicketsSettlementVO approvalVO = JSON.parseObject(otherData, TicketsSettlementVO.class); + + // 设置订单金额信息 + repairOrderInfo.setPayMoney(approvalVO.getActualMoney()); + repairOrderInfo.setGoodsPrice(approvalVO.getMoney()); + + //判断优惠类型 + if (approvalVO.getDiscountType().equals("1")) { + repairOrderInfo.setReduceMoney(BigDecimal.valueOf(approvalVO.getDiscount())); + } else if (approvalVO.getDiscountType().equals("2")) { + // 折扣计算 + repairOrderInfo.setReduceMoney(repairOrderInfo.getGoodsPrice().multiply(BigDecimal.valueOf(approvalVO.getDiscount() / 10))); + } + // 设置订单支付时间和支付结果 repairOrderInfo.setPayTime(LocalDateTime.now()); repairOrderInfo.setOrderStatus("1"); - } +// } // 更新工单 baseMapper.updateById(repairTicketsRespVO); //更新订单 repairOrderInfoService.updateById(repairOrderInfo); // 记录日志 - repairRecordsService.saveRepairRecord(one.getGoodsId(), null, RecordTypeEnum.JS.getCode(), "线下支付结算", null); + repairRecordsService.saveRepairRecord(one.getGoodsId(), null, RecordTypeEnum.SK.getCode(), "线下支付结算", null); // 更新工单主表时间 refreshUpdateTime(repairTicketsRespVO.getId()); } + /** + * @return void + * @Author 许 + * @Description 结算申请 + * @Date 10:13 2025/8/20 + * @Param [repairTicketsRespVO] + **/ + public void setTicketsSettlement(TicketsSettlementVO vo) { + /*添加结算数据*/ + // 将vo转为json + String json = JSON.toJSONString(vo); + + //添加维修记录 + repairRecordsService.saveRepairRecord(vo.getTicketId(), null, RecordTypeEnum.JSSQ.getCode(), "结算申请", null, json); + + /*获取字典 判断是否自动审核通过该结算申请*/ + DictDataRespDTO repairSettlementReview = dictDataApi.getDictData(BASE_BUSINESS_CONFIG, "repair_settlement_review"); + boolean ifReview = false; + if (ObjectUtil.isNotEmpty(repairSettlementReview)) { + ifReview = repairSettlementReview.getRemark().equals("1"); + } + + // 如果是自动审核直接修改支付状态 + if (ifReview) { + //添加维修记录 + repairRecordsService.saveRepairRecord(vo.getTicketId(), null, RecordTypeEnum.JSSP.getCode(), "自动结算审批", null, json); + + // 修改工单支付状态为待收款 + update(Wrappers.lambdaUpdate() + .eq(DlRepairTickets::getId, vo.getTicketId()) + .set(DlRepairTickets::getPayStatus, "02")); + // 修改工单支付状态为待收款 + update(Wrappers.lambdaUpdate() + .eq(DlRepairTickets::getId, vo.getTicketId()) + .set(DlRepairTickets::getPayStatus, "02")); + } + } + + /** + * @return void + * @Author 许 + * @Description 结算审批 + * @Date 13:41 2025/8/20 + * @Param [vo] + */ + @Override + public void settlementReview(TicketsSettlementVO vo) { + /*添加结算审核记录*/ + // 将vo转为json + String json = JSON.toJSONString(vo); + + //添加维修记录 + repairRecordsService.saveRepairRecord(vo.getTicketId(), null, RecordTypeEnum.JSSP.getCode(), "结算审批", null, json); + + // 修改工单支付状态为待收款 + update(Wrappers.lambdaUpdate() + .eq(DlRepairTickets::getId, vo.getTicketId()) + .set(DlRepairTickets::getPayStatus, "02")); + } + + /** + * @return cn.iocoder.yudao.module.tickets.vo.TicketsSettlementVO + * @Author 许 + * @Description 查询审批金额 + * @Date 14:20 2025/8/20 + * @Param [repairTicketsReqVO] + */ + @Override + public TicketsSettlementVO getSettlement(DlRepairTicketsReqVO repairTicketsReqVO) { + // 根据工单id 查询工单记录中的审批记录 + RepairRecords record = repairRecordsService.getOne(Wrappers.lambdaQuery() + .eq(RepairRecords::getTicketId, repairTicketsReqVO.getId()) + .eq(RepairRecords::getType, RecordTypeEnum.JSSP) + .orderByDesc(RepairRecords::getCreateTime) + .last("limit 1")); + + // 提取冗余字段 + if (record == null) + return null; + String otherData = record.getOtherData(); + // 将json 转为对象 + TicketsSettlementVO approvalVO = JSON.parseObject(otherData, TicketsSettlementVO.class); + return approvalVO; + } + /** * 客户信息和车辆信息 新增、修改 * @param customerAndCarVO 用户信息和车辆信息 diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/vo/TicketsSettlementVO.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/vo/TicketsSettlementVO.java new file mode 100644 index 00000000..be58cfbe --- /dev/null +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/vo/TicketsSettlementVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.tickets.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @BelongsProject: lanan-system + * @BelongsPackage: cn.iocoder.yudao.module.tickets.vo + * @Author: 许 + * @CreateTime: 2025-08-20 12:47 + * @Description: TODO + * @Version: 1.0 + */ +@Data +public class TicketsSettlementVO { + /** + * 工单ID + */ + private String ticketId; + /** + * 实际金额 + */ + private BigDecimal actualMoney; + + /** + * 金额 + */ + private BigDecimal money; + + /** + * 优惠类型 + */ + private String discountType; + + /** + * 优惠金额|折扣 + */ + private Integer discount; +} diff --git a/dl-module-repair/src/main/resources/mapper/tickets/DlRepairTicketsMapper.xml b/dl-module-repair/src/main/resources/mapper/tickets/DlRepairTicketsMapper.xml index a761c29c..b1cdcc1a 100644 --- a/dl-module-repair/src/main/resources/mapper/tickets/DlRepairTicketsMapper.xml +++ b/dl-module-repair/src/main/resources/mapper/tickets/DlRepairTicketsMapper.xml @@ -60,6 +60,8 @@ + + @@ -191,19 +193,31 @@ SELECT * FROM dl_repair_booking WHERE tickets_id = #{id}