This commit is contained in:
xuyuncong 2025-11-24 17:36:41 +08:00
parent c39663d616
commit 3c8d315876
13 changed files with 127 additions and 30 deletions

View File

@ -16,4 +16,13 @@ public class RepairConstants {
* 维修类型B * 维修类型B
*/ */
public static final String REPAIR_TYPE_B = "02"; public static final String REPAIR_TYPE_B = "02";
/**
* 子表类型 -工时项目
*/
public static final String ITEM_TYPE_WORK = "01";
/**
* 子表类型 -配件项目
*/
public static final String ITEM_TYPE_WARE = "02";
} }

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.base.service; package cn.iocoder.yudao.module.base.service;
import cn.iocoder.yudao.module.base.entity.StaffStatisticsResp; import cn.iocoder.yudao.module.base.entity.StaffStatisticsResp;
import cn.iocoder.yudao.module.base.service.impl.InventoryStatisticsVO;
import cn.iocoder.yudao.module.base.vo.*; import cn.iocoder.yudao.module.base.vo.*;
import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets; import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO; import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO;
@ -217,7 +218,7 @@ public interface RepairStatisticsService {
* @return java.util.List<java.util.Map < java.lang.String, java.lang.Object>> * @return java.util.List<java.util.Map < java.lang.String, java.lang.Object>>
**/ **/
List<Map<String, Object>> workTypeStatistics(QueryBusinessReqVO reqVO); List<Map<String, Object>> workTypeStatistics(QueryBusinessReqVO reqVO);
/** /**
* 根据班组工种类型统计班组下员工的工作量 * 根据班组工种类型统计班组下员工的工作量
* @param workType 工种类型 * @param workType 工种类型

View File

@ -90,4 +90,10 @@ public class DlRepairSoi extends TenantBaseDO {
*/ */
@TableField(exist = false) @TableField(exist = false)
private String houseName; private String houseName;
/**
* 销售价格
*/
@TableField(exist = false)
private BigDecimal salePrice;
} }

View File

@ -490,12 +490,14 @@ public class DlRepairSoServiceImpl extends ServiceImpl<DlRepairSoMapper, DlRepai
//工单现有配件中就有这个领取的配件需要更新这个配件的数量价格 //工单现有配件中就有这个领取的配件需要更新这个配件的数量价格
DlRepairTitem item = itemMap.get(repairSoi.getGoodsId()); DlRepairTitem item = itemMap.get(repairSoi.getGoodsId());
item.setItemCount(item.getItemCount() + repairSoi.getGoodsCount()); item.setItemCount(item.getItemCount() + repairSoi.getGoodsCount());
item.setItemMoney(item.getItemPrice().multiply(BigDecimal.valueOf(item.getItemCount())).multiply(item.getItemDiscount())); BigDecimal itemPrice = repairSoi.getGoodsPrice() != null ? repairSoi.getGoodsPrice() : item.getItemPrice();
item.setItemPrice(itemPrice);
item.setItemMoney(itemPrice.multiply(BigDecimal.valueOf(item.getItemCount())).multiply(item.getItemDiscount()));
item.setItemStatus(TicketsItemStatusEnum.RECEIVED.getCode()); item.setItemStatus(TicketsItemStatusEnum.RECEIVED.getCode());
// 获取配件的售价和进价 // 获取配件的售价和进价
BigDecimal salePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPrice(); // 售价 BigDecimal salePrice = repairSoi.getGoodsPrice() != null ? repairSoi.getGoodsPrice() : repairWaresMap.get(repairSoi.getGoodsId()).getPrice(); // 售价
BigDecimal purchasePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPurPrice(); // 进价 BigDecimal purchasePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPurPrice(); // 进价
//计算利润 //计算利润
@ -514,11 +516,13 @@ public class DlRepairSoServiceImpl extends ServiceImpl<DlRepairSoMapper, DlRepai
if (item.getItemCount() > repairSoi.getGoodsCount()) { if (item.getItemCount() > repairSoi.getGoodsCount()) {
//现有数量大于要退的数量扣掉 //现有数量大于要退的数量扣掉
item.setItemCount(item.getItemCount() - repairSoi.getGoodsCount()); item.setItemCount(item.getItemCount() - repairSoi.getGoodsCount());
BigDecimal itemPrice = repairSoi.getGoodsPrice() != null ? repairSoi.getGoodsPrice() : item.getItemPrice();
item.setItemPrice(itemPrice);
item.setItemMoney(item.getItemPrice().multiply(BigDecimal.valueOf(item.getItemCount())).multiply(item.getItemDiscount())); item.setItemMoney(item.getItemPrice().multiply(BigDecimal.valueOf(item.getItemCount())).multiply(item.getItemDiscount()));
item.setItemStatus(TicketsItemStatusEnum.RECEIVED.getCode()); item.setItemStatus(TicketsItemStatusEnum.RECEIVED.getCode());
// 重新计算利润和利润率 // 重新计算利润和利润率
BigDecimal salePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPrice(); // 售价 BigDecimal salePrice = repairSoi.getGoodsPrice() != null ? repairSoi.getGoodsPrice() : repairWaresMap.get(repairSoi.getGoodsId()).getPrice(); // 售价
BigDecimal purchasePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPurPrice(); // 进价 BigDecimal purchasePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPurPrice(); // 进价
//计算利润 //计算利润
@ -561,7 +565,7 @@ public class DlRepairSoServiceImpl extends ServiceImpl<DlRepairSoMapper, DlRepai
titem.setItemStatus(TicketsItemStatusEnum.RECEIVED.getCode()); titem.setItemStatus(TicketsItemStatusEnum.RECEIVED.getCode());
// 获取售价和进价 // 获取售价和进价
BigDecimal salePrice = waresItem.getPrice(); // 售价 BigDecimal salePrice = titem.getItemPrice(); // 售价
BigDecimal purchasePrice = waresItem.getPurPrice(); // 进价 BigDecimal purchasePrice = waresItem.getPurPrice(); // 进价
//计算利润 //计算利润

View File

@ -212,4 +212,16 @@ public class DlRepairTitemController {
public CommonResult<?> getTeamProgressWithItems(@RequestParam("ticketId") String ticketId) { public CommonResult<?> getTeamProgressWithItems(@RequestParam("ticketId") String ticketId) {
return success(dlRepairTicketsService.getTeamProgressWithItems(ticketId)); return success(dlRepairTicketsService.getTeamProgressWithItems(ticketId));
} }
/**
* @description : 查询未完成项目根据工单id
* @author xyc
* @date 10:20 2025/11/24
* @param [ticketId]
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/
@GetMapping("/getUnfinishedProjectsByTicketId")
public CommonResult<?> getUnfinishedProjectsByTicketId(@RequestParam("ticketId") String ticketId) {
return success(dlRepairTitemService.getProjectsByTicketId(ticketId, SecurityFrameworkUtils.getLoginUserId()));
}
} }

View File

@ -61,6 +61,15 @@ public interface DlRepairTitemMapper extends BaseMapper<DlRepairTitem> {
* @return java.util.List<cn.iocoder.yudao.module.tickets.entity.DlRepairTitem> * @return java.util.List<cn.iocoder.yudao.module.tickets.entity.DlRepairTitem>
**/ **/
List<DlRepairTitem> selectProjectByTicketIds(@Param("ticketIds") List<String> ticketIds); List<DlRepairTitem> selectProjectByTicketIds(@Param("ticketIds") List<String> ticketIds);
/**
* @description : 查询未完成项目
* @author xyc
* @date 10:33 2025/11/24
* @param [ticketId, userId]
* @return java.util.List<cn.iocoder.yudao.module.tickets.entity.DlRepairTitem>
**/
List<DlRepairTitem> getProjectsByTicketId(@Param("ticketId") String ticketId, @Param("userId") Long userId);
} }

View File

@ -83,4 +83,13 @@ public interface DlRepairTitemService extends IService<DlRepairTitem> {
* @return java.util.List<cn.iocoder.yudao.module.tickets.entity.DlRepairTitem> * @return java.util.List<cn.iocoder.yudao.module.tickets.entity.DlRepairTitem>
**/ **/
List<DlRepairTitemRespVO> getProjList(String ticketId,String isOpen); List<DlRepairTitemRespVO> getProjList(String ticketId,String isOpen);
/**
* @description : 查询未完成项目
* @author xyc
* @date 10:22 2025/11/24
* @param [ticketId, userId]
* @return java.util.List<cn.iocoder.yudao.module.tickets.entity.DlRepairTitem>
**/
List<DlRepairTitem> getProjectsByTicketId(String ticketId, Long userId);
} }

View File

@ -322,6 +322,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
ticketsRespVO.setTicketsStatus(TicketsStatusEnum.OVER.getCode()); ticketsRespVO.setTicketsStatus(TicketsStatusEnum.OVER.getCode());
// 支付状态 默认是已收款 // 支付状态 默认是已收款
ticketsRespVO.setPayStatus(TicketsPayStatusEnum.RECEIVED.getCode()); ticketsRespVO.setPayStatus(TicketsPayStatusEnum.RECEIVED.getCode());
// 完成
ticketsRespVO.setIsFinish("1");
} }
// 新增主表 // 新增主表

View File

@ -1,6 +1,8 @@
package cn.iocoder.yudao.module.tickets.service.impl; package cn.iocoder.yudao.module.tickets.service.impl;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.common.RepairConstants;
import cn.iocoder.yudao.common.TicketsItemStatusEnum;
import cn.iocoder.yudao.module.tickets.entity.DlRepairTitem; import cn.iocoder.yudao.module.tickets.entity.DlRepairTitem;
import cn.iocoder.yudao.module.tickets.mapper.DlRepairTitemMapper; import cn.iocoder.yudao.module.tickets.mapper.DlRepairTitemMapper;
import cn.iocoder.yudao.module.tickets.service.DlRepairTicketsService; import cn.iocoder.yudao.module.tickets.service.DlRepairTicketsService;
@ -10,6 +12,7 @@ import cn.iocoder.yudao.module.tickets.vo.DlRepairTitemRespVO;
import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -17,6 +20,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Collections;
import java.util.List; import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;
@ -163,6 +167,18 @@ public class DlRepairTitemServiceImpl extends ServiceImpl<DlRepairTitemMapper, D
public List<DlRepairTitemRespVO> getProjList(String ticketId,String isOpen) { public List<DlRepairTitemRespVO> getProjList(String ticketId,String isOpen) {
return dlRepairTitemMapper.selectProjList(ticketId,isOpen); return dlRepairTitemMapper.selectProjList(ticketId,isOpen);
} }
/**
* @param ticketId
* @return java.util.List<cn.iocoder.yudao.module.tickets.entity.DlRepairTitem>
* @description : 查询未完成项目
* @author xyc
* @date 10:22 2025/11/24
**/
@Override
public List<DlRepairTitem> getProjectsByTicketId(String ticketId, Long userId) {
return baseMapper.getProjectsByTicketId(ticketId,userId);
}
} }

View File

@ -397,35 +397,44 @@ public class DlTicketWaresServiceImpl extends ServiceImpl<DlTicketWaresMapper, D
// 把单据类型先取出来02是领料04是退料 // 把单据类型先取出来02是领料04是退料
String type = respVO.getRepairSo().getSoType(); String type = respVO.getRepairSo().getSoType();
// 查工单子表中的配件信息 // 查工单子表中的配件信息
List<DlRepairTitem> list = repairTitemService.list(new LambdaQueryWrapper<DlRepairTitem>().and(i -> { // List<DlRepairTitem> list = repairTitemService.list(new LambdaQueryWrapper<DlRepairTitem>().and(i -> {
i.eq(DlRepairTitem::getTicketId, respVO.getTicketId()) // i.eq(DlRepairTitem::getTicketId, respVO.getTicketId())
.in(DlRepairTitem::getPartId, respVO.getRepairSois() // .in(DlRepairTitem::getPartId, respVO.getRepairSois()
.stream() // .stream()
.map(DlRepairSoi::getGoodsId) // .map(DlRepairSoi::getGoodsId)
.collect(Collectors.toList())); // .collect(Collectors.toList()));
}) // })
); // );
// 计算总价 通知领料的数量可能和请求的不一样所以需要这样计算 // // 计算总价 通知领料的数量可能和请求的不一样所以需要这样计算
BigDecimal reduce = list.stream() // BigDecimal reduce = list.stream()
/* // /*
item维修工单子表中的每一个配件 // item维修工单子表中的每一个配件
map中是找到与item对应的领料单子表的配件记soi // map中是找到与item对应的领料单子表的配件记soi
将item的价格设置给soi的价格 // 将item的价格设置给soi的价格
*/ // */
.map(item -> { // .map(item -> {
DlRepairSoi repairSoi = respVO.getRepairSois().stream() // DlRepairSoi repairSoi = respVO.getRepairSois().stream()
.filter(i -> i.getGoodsId().equals(item.getPartId())).findFirst() // .filter(i -> i.getGoodsId().equals(item.getPartId())).findFirst()
.orElse(null); // .orElse(null);
if (repairSoi != null) { // if (repairSoi != null) {
repairSoi.setGoodsPrice(item.getItemPrice()); // repairSoi.setGoodsPrice(item.getItemPrice());
} // }
return repairSoi; // return repairSoi;
}) // })
// .filter(Objects::nonNull)
// // 计算soi的价格
// .map(i -> new BigDecimal(i.getGoodsCount()).multiply(i.getGoodsPrice()))
// // 计算总价
// .reduce(BigDecimal.ZERO, BigDecimal::add);
// 修改计算逻辑 根据getRepairSois中的salePrice金额来计算总价
BigDecimal reduce = respVO.getRepairSois().stream()
// 过滤出非空的 repairSoi
.filter(Objects::nonNull) .filter(Objects::nonNull)
// 计算soi的价格 // 计算 salePrice goodsCount 的乘积
.map(i -> new BigDecimal(i.getGoodsCount()).multiply(i.getGoodsPrice())) .map(i -> new BigDecimal(i.getGoodsCount()).multiply(i.getGoodsPrice()))
// 计算总价 // 计算总价
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
// 生成领料单退料单 // 生成领料单退料单
respVO.getRepairSo().setTotalPrice(reduce); respVO.getRepairSo().setTotalPrice(reduce);
respVO.getRepairSo().setItemCount(respVO.getRepairSois().stream().mapToInt(DlRepairSoi::getGoodsCount).sum()); respVO.getRepairSo().setItemCount(respVO.getRepairSois().stream().mapToInt(DlRepairSoi::getGoodsCount).sum());

View File

@ -116,4 +116,5 @@ public class DlRepairTicketsRespVO extends DlRepairTickets {
/** 开票备注 */ /** 开票备注 */
private String billedRemark; private String billedRemark;
private Integer hasChildTickets; private Integer hasChildTickets;
private List<DlRepairTicketsRespVO> bTickets;
} }

View File

@ -139,6 +139,7 @@
<result property="hasChildTickets" column="hasChildTickets" /> <result property="hasChildTickets" column="hasChildTickets" />
<association property="booking" javaType="cn.iocoder.yudao.module.booking.entity.DlRepairBooking" select="selectBookingById" column="id"/> <association property="booking" javaType="cn.iocoder.yudao.module.booking.entity.DlRepairBooking" select="selectBookingById" column="id"/>
<collection property="itemList" column="id" ofType="cn.iocoder.yudao.module.tickets.entity.DlRepairTitem" select="selectItemList" /> <collection property="itemList" column="id" ofType="cn.iocoder.yudao.module.tickets.entity.DlRepairTitem" select="selectItemList" />
<collection property="bTickets" column="id" ofType="cn.iocoder.yudao.module.tickets.entity.DlRepairTickets" select="selectATicketsList" />
</resultMap> </resultMap>
<sql id="Base_SQL"> <sql id="Base_SQL">
@ -434,6 +435,13 @@
order by drt.update_time desc order by drt.update_time desc
</select> </select>
<select id="selectATicketsList" resultType="cn.iocoder.yudao.module.tickets.entity.DlRepairTickets">
select drt.*
from dl_repair_tickets drt
where drt.deleted = '0'
and drt.parent_ticket_id = #{id}
</select>
<select id="selectItemList" resultType="cn.iocoder.yudao.module.tickets.entity.DlRepairTitem"> <select id="selectItemList" resultType="cn.iocoder.yudao.module.tickets.entity.DlRepairTitem">
select drti.*,drw.work_type AS workerType select drti.*,drw.work_type AS workerType
from dl_repair_titem drti from dl_repair_titem drti
@ -613,6 +621,9 @@
<if test="map.insuranceCompany != null and map.insuranceCompany != ''"> <if test="map.insuranceCompany != null and map.insuranceCompany != ''">
AND drt.insurance_company = #{map.insuranceCompany} AND drt.insurance_company = #{map.insuranceCompany}
</if> </if>
<if test="map.ticketType != null and map.ticketType != ''">
AND drt.ticket_type = #{map.ticketType}
</if>
<if test="map.accessoriesType != null and map.accessoriesType != ''"> <if test="map.accessoriesType != null and map.accessoriesType != ''">
<if test="map.accessoriesType == 'request'"> <if test="map.accessoriesType == 'request'">
/*查询配件申请单不能为空的*/ /*查询配件申请单不能为空的*/

View File

@ -154,4 +154,12 @@
AND r.id IS NULL AND r.id IS NULL
AND t.deleted = b'0'; AND t.deleted = b'0';
</select> </select>
<select id="getProjectsByTicketId" resultType="cn.iocoder.yudao.module.tickets.entity.DlRepairTitem">
SELECT *
FROM dl_repair_titem
WHERE ticket_id = #{ticketId}
AND item_type = '01'
AND item_status != '03'
AND FIND_IN_SET(#{userId}, repair_ids) > 0
</select>
</mapper> </mapper>