This commit is contained in:
xuyuncong 2025-10-23 11:43:03 +08:00
parent 0c5fc6cb10
commit f8c7e851de
20 changed files with 536 additions and 77 deletions

View File

@ -0,0 +1,101 @@
package cn.iocoder.yudao.module.account.controller.admin;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.account.entity.BaseCompanyAccount;
import cn.iocoder.yudao.module.account.service.IBaseCompanyAccountService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
/**
* <p>
* 收款账户表 前端控制器
* </p>
*
* @author
* @since 2025-10-22
*/
@RestController
@RequestMapping("/base-company-account")
@RequiredArgsConstructor
public class BaseCompanyAccountController {
private final IBaseCompanyAccountService baseCompanyAccountService;
/**
* 分页查询收款账户
* @param request 查询条件
* @param pageNo 页码
* @param pageSize 每页数量
* @return 分页结果
*/
@GetMapping("/page")
public CommonResult<?> page(BaseCompanyAccount request,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<BaseCompanyAccount> page = new Page<>(pageNo, pageSize);
LambdaQueryWrapper<BaseCompanyAccount> wrapper = new LambdaQueryWrapper<>();
// 根据账户名称模糊查询
if (ObjectUtil.isNotEmpty(request.getAccountName())) {
wrapper.like(BaseCompanyAccount::getAccountName, request.getAccountName());
}
// 根据账户号码模糊查询
if (ObjectUtil.isNotEmpty(request.getAccountNumber())) {
wrapper.like(BaseCompanyAccount::getAccountNumber, request.getAccountNumber());
}
// 根据系统标识查询
if (ObjectUtil.isNotEmpty(request.getSystemCode())) {
wrapper.eq(BaseCompanyAccount::getSystemCode, request.getSystemCode());
}
wrapper.orderByDesc(BaseCompanyAccount::getId);
return CommonResult.success(baseCompanyAccountService.page(page, wrapper));
}
/**
* 创建收款账户
* @param request 账户信息
* @return 是否成功
*/
@PostMapping("/create")
public CommonResult<?> create(@RequestBody BaseCompanyAccount request) {
return CommonResult.success(baseCompanyAccountService.save(request));
}
/**
* 更新收款账户
* @param request 账户信息
* @return 是否成功
*/
@PutMapping("/update")
public CommonResult<?> update(@RequestBody BaseCompanyAccount request) {
return CommonResult.success(baseCompanyAccountService.updateById(request));
}
/**
* 删除收款账户
* @param id 账户ID
* @return 是否成功
*/
@DeleteMapping("/delete")
public CommonResult<?> delete(Long id) {
return CommonResult.success(baseCompanyAccountService.removeById(id));
}
/**
* 根据ID获取收款账户详情
* @param id 账户ID
* @return 账户详情
*/
@GetMapping("/get")
public CommonResult<?> get(Long id) {
return CommonResult.success(baseCompanyAccountService.getById(id));
}
}

View File

@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.account.entity;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 收款账户表
* </p>
*
* @author
* @since 2025-10-22
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("base_company_account")
public class BaseCompanyAccount extends TenantBaseDO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 账户ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 账户名称
*/
private String accountName;
/**
* 账户号码
*/
private String accountNumber;
/**
* 系统标识
*/
private String systemCode;
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.account.mapper;
import cn.iocoder.yudao.module.account.entity.BaseCompanyAccount;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 收款账户表 Mapper 接口
* </p>
*
* @author
* @since 2025-10-22
*/
@Mapper
public interface BaseCompanyAccountMapper extends BaseMapper<BaseCompanyAccount> {
}

View File

@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.account.service;
import cn.iocoder.yudao.module.account.entity.BaseCompanyAccount;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 收款账户表 服务类
* </p>
*
* @author
* @since 2025-10-22
*/
public interface IBaseCompanyAccountService extends IService<BaseCompanyAccount> {
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.account.service.impl;
import cn.iocoder.yudao.module.account.entity.BaseCompanyAccount;
import cn.iocoder.yudao.module.account.mapper.BaseCompanyAccountMapper;
import cn.iocoder.yudao.module.account.service.IBaseCompanyAccountService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 收款账户表 服务实现类
* </p>
*
* @author
* @since 2025-10-22
*/
@Service
public class BaseCompanyAccountServiceImpl extends ServiceImpl<BaseCompanyAccountMapper, BaseCompanyAccount> implements IBaseCompanyAccountService {
}

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.chargeCompany.controller.admin;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.chargeCompany.entity.BaseChargeCompany;
import cn.iocoder.yudao.module.chargeCompany.service.IBaseChargeCompanyService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -93,4 +94,18 @@ public class BaseChargeCompanyController {
return CommonResult.success(baseChargeCompanyService.removeById(id));
}
/**
* @description : 审核挂账单位
* @author xyc
* @date 14:38 2025/10/22
* @param request {@link BaseChargeCompany}
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/
@PutMapping("/review")
public CommonResult<?> review(@RequestBody BaseChargeCompany request){
request.setContactUserId(SecurityFrameworkUtils.getLoginUserId());
request.setContactUserName(SecurityFrameworkUtils.getLoginUserNickname());
return CommonResult.success(baseChargeCompanyService.updateById(request));
}
}

View File

@ -75,7 +75,7 @@ public class BaseChargeCompany extends TenantBaseDO implements Serializable {
/**
* 对接人ID
*/
private String contactUserId;
private Long contactUserId;
/**
* 对接人名称

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.account.mapper.BaseCompanyAccountMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.iocoder.yudao.module.account.entity.BaseCompanyAccount">
<id column="id" property="id" />
<result column="account_name" property="accountName" />
<result column="account_number" property="accountNumber" />
<result column="system_code" property="systemCode" />
<result column="tenant_id" property="tenantId" />
<result column="deleted" property="deleted" />
<result column="creator" property="creator" />
<result column="create_time" property="createTime" />
<result column="updater" property="updater" />
<result column="update_time" property="updateTime" />
</resultMap>
</mapper>

View File

@ -43,6 +43,10 @@ public enum RecordTypeEnum {
* 结算
*/
JS("js","结算"),
/**
* 反结算
*/
FJS("fjs","反结算"),
/**
* 结束工单
*/

View File

@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets;
import cn.iocoder.yudao.module.tickets.entity.DlRepairTitem;
import cn.iocoder.yudao.module.tickets.service.DlRepairTicketsService;
import cn.iocoder.yudao.module.tickets.vo.*;
import com.alibaba.excel.EasyExcel;
@ -101,7 +102,7 @@ public class DlRepairTicketsController {
public CommonResult<?> getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
Page<DlRepairTickets> page = new Page<>(pageNo, pageSize);
Page<DlRepairTicketsRespVO> page = new Page<>(pageNo, pageSize);
return success(dlRepairTicketsService.getTicketsPage(repairTicketsReqVO, page));
}
@ -235,6 +236,19 @@ public class DlRepairTicketsController {
return CommonResult.ok();
}
/**
* @description : 反结算
* @author xyc
* @date 14:51 2025/10/22
* @param repairTicketsRespVO {@link DlRepairTicketsRespVO}
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/
@PostMapping("/antiSettlement")
public CommonResult<?> antiSettlement(@RequestBody DlRepairTicketsRespVO repairTicketsRespVO) {
dlRepairTicketsService.antiSettlement(repairTicketsRespVO);
return CommonResult.ok();
}
/**
* @Author
* @Description 结算审批
@ -727,10 +741,10 @@ public class DlRepairTicketsController {
public void exportByStatus(DlRepairTicketsReqVO repairTicketsReqVO, HttpServletResponse response)throws IOException{
int pageNo = 1, pageSize = 1000;
List<TicketExportByStatusVO> list = new ArrayList<>();
Page<DlRepairTickets> page = new Page<>(pageNo, pageSize);
Page<DlRepairTicketsRespVO> page = new Page<>(pageNo, pageSize);
do {
IPage<DlRepairTickets> ticketsPage = dlRepairTicketsService.getTicketsPage(repairTicketsReqVO, page);
List<DlRepairTickets> records = ticketsPage.getRecords();
IPage<DlRepairTicketsRespVO> ticketsPage = dlRepairTicketsService.getTicketsPage(repairTicketsReqVO, page);
List<DlRepairTicketsRespVO> records = ticketsPage.getRecords();
if (CollUtil.isEmpty(records)){
break;
}
@ -785,6 +799,159 @@ public class DlRepairTicketsController {
return CommonResult.ok();
}
/**
* 导出数据(合并单元格格式)
*
* @author Lingma
* @date 2025/10/23
* @param repairTicketsReqVO 请求对象
**/
@GetMapping("/exportMerged")
@Operation(summary = "导出数据(合并单元格格式)")
public void exportMergedData(DlRepairTicketsReqVO repairTicketsReqVO, HttpServletResponse response) throws IOException {
int pageNo = 1, pageSize = 1000;
Page<DlRepairTicketsRespVO> page = new Page<>(pageNo, pageSize);
if (StringUtils.isEmpty(repairTicketsReqVO.getSelectType())) {
//查询类型为空默认查待处理的
repairTicketsReqVO.setSelectType(RepairCons.TICKETS_WAITING);
}
List<DlRepairTicketsRespVO> list = new ArrayList<>();
do {
IPage<DlRepairTicketsRespVO> pageType = dlRepairTicketsService.getTicketsPage(repairTicketsReqVO, page);
List<DlRepairTicketsRespVO> records = pageType.getRecords();
if (CollUtil.isEmpty(records)){
break;
}
List<DlRepairTicketsRespVO> convertedRecords = records;
list.addAll(convertedRecords);
pageNo++;
page.setCurrent(pageNo);
} while (true);
if (CollUtil.isEmpty(list)) {
throw exception0(500, "没有数据可以导出");
}
// 获取字典数据
List<DictDataRespDTO> repairTypeList = dictDataApi.getDictDataList(RepairDictConstants.REPAIR_TYPE);
List<DictDataRespDTO> repairWorkTypeList = dictDataApi.getDictDataList(RepairDictConstants.REPAIR_WORK_TYPE);
// 转换为Map便于查找
Map<String, String> repairTypeMap = repairTypeList.stream()
.collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel));
Map<String, String> repairWorkTypeMap = repairWorkTypeList.stream()
.collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel));
Map<String, String> repairItemTypeMap = new HashMap<>();
repairItemTypeMap.put("01", "项目");
repairItemTypeMap.put("02", "配件");
// 构建导出数据
List<List<String>> rows = new ArrayList<>();
// 表头
rows.add(Arrays.asList(
"序号", "订单编号", "维修类别", "客户名称", "车牌号", "车系", "手机号",
"经办人姓名", "经办人电话", "合计金额", "参考毛利", "服务顾问",
"项目名称", "数量", "项目金额", "毛利", "毛利率", "类别", "班组",
"维修员工", "销售人员", "备注", "收款账号", "确认收款状态", "确认收款备注"
));
int index = 1;
for (DlRepairTicketsRespVO ticket : list) {
// 获取工单项目列表
List<DlRepairTitem> itemList = ticket.getItemList();
// 如果没有项目则至少添加一行显示工单基本信息
if (CollUtil.isEmpty(itemList)) {
List<String> row = Arrays.asList(
String.valueOf(index++),
ticket.getTicketNo() != null ? ticket.getTicketNo() : "",
repairTypeMap.get(ticket.getRepairType()) != null ? repairTypeMap.get(ticket.getRepairType()) : "",
ticket.getUserName() != null ? ticket.getUserName() : "",
ticket.getCarNo() != null ? ticket.getCarNo() : "",
ticket.getCarBrandName() != null ? ticket.getCarBrandName() : "",
ticket.getUserMobile() != null ? ticket.getUserMobile() : "",
ticket.getHandleName() != null ? ticket.getHandleName() : "",
ticket.getHandleMobile() != null ? ticket.getHandleMobile() : "",
ticket.getTotalPrice() != null ? ticket.getTotalPrice().toString() : "0",
ticket.getProfit() != null ? ticket.getProfit().toString() : "0",
ticket.getAdviserName() != null ? ticket.getAdviserName() : "",
"", "", "", "", "", "", "", "", "", "",
ticket.getReceivablesAccount() != null ? ticket.getReceivablesAccount() : "",
"1".equals(ticket.getPayConfirm()) ? "已确认" : "未确认",
ticket.getPayConfirmRemark() != null ? ticket.getPayConfirmRemark() : ""
);
rows.add(row);
} else {
// 有项目时第一行显示工单信息和第一个项目信息
DlRepairTitem firstItem = itemList.get(0);
List<String> firstRow = Arrays.asList(
String.valueOf(index++),
ticket.getTicketNo() != null ? ticket.getTicketNo() : "",
repairTypeMap.get(ticket.getRepairType()) != null ? repairTypeMap.get(ticket.getRepairType()) : "",
ticket.getUserName() != null ? ticket.getUserName() : "",
ticket.getCarNo() != null ? ticket.getCarNo() : "",
ticket.getCarBrandName() != null ? ticket.getCarBrandName() : "",
ticket.getUserMobile() != null ? ticket.getUserMobile() : "",
ticket.getHandleName() != null ? ticket.getHandleName() : "",
ticket.getHandleMobile() != null ? ticket.getHandleMobile() : "",
ticket.getTotalPrice() != null ? ticket.getTotalPrice().toString() : "0",
ticket.getProfit() != null ? ticket.getProfit().toString() : "0",
ticket.getAdviserName() != null ? ticket.getAdviserName() : "",
firstItem.getItemName() != null ? firstItem.getItemName() : "",
firstItem.getItemCount() != null ? firstItem.getItemCount().toString() : "0",
firstItem.getItemMoney() != null ? firstItem.getItemMoney().toString() : "0",
firstItem.getItemProfit() != null ? firstItem.getItemProfit().toString() : "",
firstItem.getItemProfitRate() != null ? firstItem.getItemProfitRate().toString() : "",
"01".equals(firstItem.getItemType()) ? "公时" : "配件",
repairWorkTypeMap.get(firstItem.getWorkerType()) != null ? repairWorkTypeMap.get(firstItem.getWorkerType()) : "",
firstItem.getRepairNames() != null ? firstItem.getRepairNames() : "",
firstItem.getSaleName() != null ? firstItem.getSaleName() : "",
firstItem.getRemark() != null ? firstItem.getRemark() : "",
ticket.getReceivablesAccount() != null ? ticket.getReceivablesAccount() : "",
"1".equals(ticket.getPayConfirm()) ? "已确认" : "未确认",
ticket.getPayConfirmRemark() != null ? ticket.getPayConfirmRemark() : ""
);
rows.add(firstRow);
// 后续行只显示项目信息
for (int i = 1; i < itemList.size(); i++) {
DlRepairTitem item = itemList.get(i);
List<String> row = Arrays.asList(
"", ticket.getTicketNo() != null ? ticket.getTicketNo() : "",
repairTypeMap.get(ticket.getRepairType()) != null ? repairTypeMap.get(ticket.getRepairType()) : "",
ticket.getUserName() != null ? ticket.getUserName() : "",
ticket.getCarNo() != null ? ticket.getCarNo() : "",
ticket.getCarBrandName() != null ? ticket.getCarBrandName() : "",
ticket.getUserMobile() != null ? ticket.getUserMobile() : "",
ticket.getHandleName() != null ? ticket.getHandleName() : "",
ticket.getHandleMobile() != null ? ticket.getHandleMobile() : "",
ticket.getTotalPrice() != null ? ticket.getTotalPrice().toString() : "0",
ticket.getProfit() != null ? ticket.getProfit().toString() : "0",
ticket.getAdviserName() != null ? ticket.getAdviserName() : "",
item.getItemName() != null ? item.getItemName() : "",
item.getItemCount() != null ? item.getItemCount().toString() : "0",
item.getItemMoney() != null ? item.getItemMoney().toString() : "0",
item.getItemProfit() != null ? item.getItemProfit().toString() : "",
item.getItemProfitRate() != null ? item.getItemProfitRate().toString() : "",
"01".equals(item.getItemType()) ? "公时" : "配件",
repairWorkTypeMap.get(item.getWorkerType()) != null ? repairWorkTypeMap.get(item.getWorkerType()) : "",
item.getRepairNames() != null ? item.getRepairNames() : "",
item.getSaleName() != null ? item.getSaleName() : "",
item.getRemark() != null ? item.getRemark() : "",
ticket.getReceivablesAccount() != null ? ticket.getReceivablesAccount() : "",
"1".equals(ticket.getPayConfirm()) ? "已确认" : "未确认",
ticket.getPayConfirmRemark() != null ? ticket.getPayConfirmRemark() : ""
);
rows.add(row);
}
}
}
ExcelUtils.exportExcel("维修工单明细", rows, CollUtil.newArrayList(12), response);
}
/**
* 格式化为百分比字符串
* @param value

View File

@ -255,6 +255,8 @@ public class DlRepairTickets extends TenantBaseDO {
private String payConfirm;
/** 支付确认备注 */
private String payConfirmRemark;
/** 结算方式 方式 gz 挂账 xj 现结 */
private String settlementType;
/** 更新时上传的图片 */
@TableField(exist = false)

View File

@ -125,4 +125,11 @@ import lombok.EqualsAndHashCode;
* 备注
*/
private String remark;
@TableField(exist = false)
private String workerType;
@TableField(exist = false)
private String isLeads;
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.tickets.mapper;
import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsReqVO;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -28,7 +29,7 @@ public interface DlRepairTicketsMapper extends BaseMapper<DlRepairTickets> {
* @date 20:51 2024/9/20
* @param repairTicketsReqVO 查询对象
**/
IPage<DlRepairTickets> getTicketsPage(@Param("map") DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTickets> page);
IPage<DlRepairTicketsRespVO> getTicketsPage(@Param("map") DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTicketsRespVO> page);
/**
* 分类查询工单分页----待处理的

View File

@ -34,7 +34,7 @@ public interface DlRepairTicketsService extends IService<DlRepairTickets> {
* @author 小李
* @date 20:51 2024/9/20
**/
IPage<DlRepairTickets> getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTickets> page);
IPage<DlRepairTicketsRespVO> getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTicketsRespVO> page);
/**
* 获得一个工单的详细信息
@ -345,4 +345,12 @@ public interface DlRepairTicketsService extends IService<DlRepairTickets> {
* @Param [repairTicketsRespVO]
**/
void payConfirm(DlRepairTicketsRespVO repairTicketsRespVO);
/**
* @description : 反结算
* @author xyc
* @date 14:52 2025/10/22
* @param repairTicketsRespVO {@link DlRepairTicketsRespVO}
**/
void antiSettlement(DlRepairTicketsRespVO repairTicketsRespVO);
}

View File

@ -393,8 +393,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
* @date 20:51 2024/9/20
**/
@Override
public IPage<DlRepairTickets> getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTickets> page) {
IPage<DlRepairTickets> ticketsPage = baseMapper.getTicketsPage(repairTicketsReqVO, page);
public IPage<DlRepairTicketsRespVO> getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTicketsRespVO> page) {
IPage<DlRepairTicketsRespVO> ticketsPage = baseMapper.getTicketsPage(repairTicketsReqVO, page);
ticketsPage.getRecords().forEach(item -> {
if (ObjectUtil.isNotEmpty(item.getSettlementStr())) {
// 将json字符串转换成对象
@ -759,6 +759,7 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
RepairOrderInfo repairOrderInfo = new RepairOrderInfo();
repairOrderInfo.setId(one.getId());
repairOrderInfo.setPayType(repairTicketsRespVO.getPayType());
repairOrderInfo.setReceivablesAccount(repairTicketsRespVO.getReceivablesAccount());
// 更新工单
// 在这里把工单的状态更新为已完成---需要判断如果是线上支付需要在支付回调更新----有点问题
@ -834,6 +835,11 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
throw exception0(500, "请先完成配件申领");
}
/*修改工单表的结算方式*/
update(Wrappers.<DlRepairTickets>lambdaUpdate()
.eq(DlRepairTickets::getId, vo.getTicketId())
.set(DlRepairTickets::getSettlementType, vo.getSettlementType()));
/*添加结算数据*/
// 将vo转为json
String json = JSON.toJSONString(vo);
@ -873,6 +879,10 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
*/
@Override
public void settlementReview(TicketsSettlementVO vo) {
/* 修改工单表中结算方式*/
update(Wrappers.<DlRepairTickets>lambdaUpdate()
.eq(DlRepairTickets::getId, vo.getTicketId())
.set(DlRepairTickets::getSettlementType, vo.getSettlementType()));
/*添加结算审核记录*/
// 将vo转为json
String json = JSON.toJSONString(vo);
@ -999,6 +1009,22 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
repairRecordsService.saveRepairRecord(repairTicketsRespVO.getId(), null, RecordTypeEnum.QRSK.getCode(), RecordTypeEnum.QRSK.getName(), null, null);
}
/**
* @param repairTicketsRespVO {@link DlRepairTicketsRespVO}
* @description : 反结算
* @author xyc
* @date 14:52 2025/10/22
**/
@Override
public void antiSettlement(DlRepairTicketsRespVO repairTicketsRespVO) {
// 设置工单收款状态为反结算04
update(Wrappers.<DlRepairTickets>lambdaUpdate()
.eq(DlRepairTickets::getId, repairTicketsRespVO.getId())
.set(DlRepairTickets::getPayStatus, "04"));
// 添加工单记录
repairRecordsService.saveRepairRecord(repairTicketsRespVO.getId(), null, RecordTypeEnum.FJS.getCode(), RecordTypeEnum.FJS.getName(), null, null);
}
// 获取已完成工单按维修类型分组的统计优化版本
private Map<String, Long> getOverStatsByRepairType(String startDate, String endDate) {
// 直接使用 mapper 查询已完成工单并按 repairType 分组

View File

@ -67,4 +67,7 @@ public class DlRepairTicketsReqVO extends DlRepairTickets {
/** 支付状态 receivable应收款 receivedAmount已收款 pendingAmount代收款 */
private String payStatus;
/** 支付状态集和 */
private List<String> payStatuses;
}

View File

@ -94,4 +94,7 @@ public class DlRepairTicketsRespVO extends DlRepairTickets {
/** 是否支付 */
private String isPaid;
/** 收款账户 */
private String receivablesAccount;
}

View File

@ -44,7 +44,7 @@ public class TicketsSettlementVO {
private Long chargeCompanyId;
/**
* 支付方式 gz 挂账 xj 现结
* 结算方式 gz 挂账 xj 现结
*/
private String payType;
private String settlementType;
}

View File

@ -81,6 +81,8 @@
<result property="carBrandName" column="car_brand_name" jdbcType="VARCHAR"/>
<result property="carBrandType" column="car_brand_type" jdbcType="VARCHAR"/>
<result property="busiFrom" column="busi_from" jdbcType="VARCHAR"/>
<result property="payTime" column="pay_time" jdbcType="VARCHAR"/>
<result property="receivablesAccount" column="receivables_account" jdbcType="VARCHAR"/>
<result property="adviserId" column="adviser_id" jdbcType="VARCHAR"/>
<result property="adviserName" column="adviser_name" jdbcType="VARCHAR"/>
<result property="payType" column="pay_type" jdbcType="VARCHAR"/>
@ -197,61 +199,71 @@
<select id="selectBookingById" resultType="cn.iocoder.yudao.module.booking.entity.DlRepairBooking">
SELECT * FROM dl_repair_booking WHERE tickets_id = #{id}
</select>
<select id="getTicketsPage" resultMap="BaseResultMap">
SELECT drt.*,rorder.pay_time AS pay_time
<if test="map.payStatus != null and map.payStatus != '' and map.payStatus == '01'">
<select id="getTicketsPage" resultMap="APPBaseResultMap">
SELECT drt.*,rorder.pay_time AS payTime,rorder.receivables_account AS receivablesAccount
<if test="(map.payStatus != null and map.payStatus != '' and (map.payStatus == '01' or map.payStatus == '04')) or (map.payStatuses != null and map.payStatuses.size() > 0 and (map.payStatuses.indexOf('01') >= 0 or map.payStatuses.indexOf('04') >= 0))">
,drr.other_data AS settlementStr
</if>
FROM dl_repair_tickets drt
LEFT JOIN repair_order_info rorder ON rorder.goods_id = drt.id
<if test="map.payStatus != null and map.payStatus != '' and map.payStatus == '01'">
LEFT JOIN repair_order_info rorder ON rorder.goods_id = drt.id
<if test="(map.payStatus != null and map.payStatus != '' and (map.payStatus == '01' or map.payStatus == '04')) or (map.payStatuses != null and map.payStatuses.size() > 0 and (map.payStatuses.indexOf('01') >= 0 or map.payStatuses.indexOf('04') >= 0))">
LEFT JOIN dl_repair_records drr ON drt.id = drr.ticket_id AND drr.type = 'jssq'
</if>
<where>
drt.deleted = '0'
<!-- 已结算的 -->
<if test="map.ticketsStatus != null and map.ticketsStatus != '' and map.ticketsStatus == '02'">
and drt.tickets_status in ('08', #{map.ticketsStatus})
</if>
<if test="map.ticketsStatus != null and map.ticketsStatus != '' and map.ticketsStatus == '02'">
and drt.tickets_status in ('08', #{map.ticketsStatus})
</if>
<!-- 已作废的 -->
<if test="map.ticketsStatus != null and map.ticketsStatus != '' and map.ticketsStatus == '03'">
and drt.tickets_status = #{map.ticketsStatus}
</if>
<if test="map.ticketsStatus != null and map.ticketsStatus != '' and map.ticketsStatus == '03'">
and drt.tickets_status = #{map.ticketsStatus}
</if>
<!-- 待结算的 -->
<if test="map.ticketsStatus != null and map.ticketsStatus != '' and map.ticketsStatus == '01'">
and (drt.tickets_status = #{map.ticketsStatus})
</if>
<if test="map.payStatus != null and map.payStatus != ''">
and drt.pay_status = #{map.payStatus}
</if>
<if test="map.ticketNo != null and map.ticketNo != ''">
and (
drt.ticket_no like concat('%', #{map.ticketNo}, '%')
or
drt.car_no like concat('%', #{map.ticketNo}, '%')
or
drt.user_name like concat('%', #{map.ticketNo}, '%')
or
drt.user_mobile like concat('%', #{map.ticketNo}, '%')
or
drt.remark like concat('%', #{map.ticketNo}, '%')
)
</if>
<if test="map.searchTimeArray != null and map.searchTimeArray.length > 0">
AND (drt.create_time BETWEEN CONCAT(#{map.searchTimeArray[0]}, ' 00:00:00') AND CONCAT(#{map.searchTimeArray[1]}, ' 23:59:59'))
</if>
<if test="map.repairType != null and map.repairType != ''">
and drt.repair_type = #{map.repairType}
</if>
<if test="map.corpId != null and map.corpId != ''">
and drt.corp_id = #{map.corpId}
</if>
<if test="map.userId != null and map.userId != ''">
and drt.user_id = #{map.userId}
</if>
<if test="map.ticketsWorkStatus != null and map.ticketsWorkStatus != ''">
and drt.tickets_work_status = #{map.ticketsWorkStatus}
</if>
<if test="map.ticketsStatus != null and map.ticketsStatus != '' and map.ticketsStatus == '01'">
and (drt.tickets_status = #{map.ticketsStatus})
</if>
<if test="map.payStatus != null and map.payStatus != ''">
and drt.pay_status = #{map.payStatus}
</if>
<if test="map.payStatuses != null and map.payStatuses.size() > 0">
and drt.pay_status in
<foreach collection="map.payStatuses" item="status" open="(" separator="," close=")">
#{status}
</foreach>
</if>
<if test="map.ticketNo != null and map.ticketNo != ''">
and (
drt.ticket_no like concat('%', #{map.ticketNo}, '%')
or
drt.car_no like concat('%', #{map.ticketNo}, '%')
or
drt.user_name like concat('%', #{map.ticketNo}, '%')
or
drt.user_mobile like concat('%', #{map.ticketNo}, '%')
or
drt.remark like concat('%', #{map.ticketNo}, '%')
)
</if>
<if test="map.searchTimeArray != null and map.searchTimeArray.length > 0">
AND (drt.create_time BETWEEN CONCAT(#{map.searchTimeArray[0]}, ' 00:00:00') AND
CONCAT(#{map.searchTimeArray[1]}, ' 23:59:59'))
</if>
<if test="map.repairType != null and map.repairType != ''">
and drt.repair_type = #{map.repairType}
</if>
<if test="map.corpId != null and map.corpId != ''">
and drt.corp_id = #{map.corpId}
</if>
<if test="map.userId != null and map.userId != ''">
and drt.user_id = #{map.userId}
</if>
<if test="map.ticketsWorkStatus != null and map.ticketsWorkStatus != ''">
and drt.tickets_work_status = #{map.ticketsWorkStatus}
</if>
</where>
order by drt.create_time desc
</select>
@ -393,26 +405,10 @@
</select>
<select id="selectItemList" resultType="cn.iocoder.yudao.module.tickets.entity.DlRepairTitem">
select drti.id ,
drti.ticket_id ,
drti.item_name ,
drti.item_count ,
drti.item_unit ,
drti.item_price ,
drti.item_discount ,
drti.item_money ,
drti.repair_ids ,
drti.repair_names ,
drti.sale_id ,
drti.sale_name ,
drti.item_type ,
drti.project_id ,
drti.part_id ,
drti.other_id ,
drti.item_type_id ,
drti.item_status ,
drti.remark
select drti.*,drw.work_type AS workerType
from dl_repair_titem drti
LEFT JOIN dl_repair_worker drw
ON FIND_IN_SET(drw.user_id, drti.repair_ids) > 0 AND drw.deleted = '0'
where drti.ticket_id = #{id} AND drti.deleted = '0'
</select>

View File

@ -47,6 +47,8 @@ public class ExcelExtraHelper {
// ============ 5. 根据内容自动调节列宽 ============
int colSize = rows.get(0).size();
int[] maxLength = new int[colSize];
// Excel最大列宽限制为255个字符
int maxColumnWidth = 255;
for (List<String> row : rows) {
for (int colIndex = 0; colIndex < colSize; colIndex++) {
@ -60,7 +62,9 @@ public class ExcelExtraHelper {
}
}
for (int i = 0; i < colSize; i++) {
writer.setColumnWidth(i, maxLength[i] + 2);
// 限制最大列宽不超过255个字符避免POI抛出异常
int columnWidth = Math.min(maxLength[i] + 2, maxColumnWidth);
writer.setColumnWidth(i, columnWidth);
}
// ============ 6. 设置时间列 & 数字列格式 ============
@ -101,4 +105,4 @@ public class ExcelExtraHelper {
}
return length;
}
}
}