zss
2025-09-22 bc041bbe418b340af60fafd1c4e15463624e96e3
Merge branch 'master' into pim_zss
已添加33个文件
已修改14个文件
1347 ■■■■■ 文件已修改
src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/StaffContactsPersonalDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/StaffContactsPersonalMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/StaffContactsPersonal.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/StaffContactsPersonalService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/impl/StaffContactsPersonalServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceRepairController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceDefectRecordDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/mapper/DeviceDefectRecordMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceDefectRecord.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/DeviceDefectRecordService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceDefectRecordServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesQuotationMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesQuotationProductMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/SalesQuotationProductService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/SalesQuotationService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationProductServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/StaffContactsPersonalMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceDefectRecordMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesQuotationMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesQuotationProductMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.collaborativeApproval.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
import com.ruoyi.collaborativeApproval.service.StaffContactsPersonalService;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/staffContactsPersonal")
@AllArgsConstructor
public class StaffContactsPersonalController {
    @Autowired
    private StaffContactsPersonalService staffContactsPersonalService;
    @GetMapping("/getList")
    @ApiOperation("分页查询")
    public AjaxResult listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO ){
        return AjaxResult.success(staffContactsPersonalService.listPage(page, staffContactsPersonalDTO));
    }
    @PostMapping("/add")
    @ApiOperation("新增")
    public AjaxResult add(@RequestBody StaffContactsPersonal staffContactsPersonal){
        return AjaxResult.success(staffContactsPersonalService.save(staffContactsPersonal));
    }
    @DeleteMapping("/delete/{id}")
    @ApiOperation("删除")
    public AjaxResult delete(@PathVariable("id") Long id){
//        if (CollectionUtils.isEmpty(id)) {
//            throw new RuntimeException("请传入要删除的ID");
//        }
        return AjaxResult.success(staffContactsPersonalService.removeById(id));
    }
}
src/main/java/com/ruoyi/collaborativeApproval/dto/StaffContactsPersonalDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.collaborativeApproval.dto;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
@Data
public class StaffContactsPersonalDTO extends StaffContactsPersonal {
    private String staffNo;
    private String staffName;
    private String sex;
    private String postJob;
    private String adress;
    private String profession;
    private String identityCard;
    private String phone;
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/StaffContactsPersonalMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.collaborativeApproval.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface StaffContactsPersonalMapper extends BaseMapper<StaffContactsPersonal> {
    IPage listPage(Page page,@Param("staffContactsPersonalDTO") StaffContactsPersonalDTO staffContactsPersonalDTO);
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java
@@ -91,6 +91,31 @@
    @TableField(value = "tags",typeHandler = ListToStringTypeHandler.class,jdbcType = JdbcType.VARCHAR)
    private List<String> tags;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
src/main/java/com/ruoyi/collaborativeApproval/pojo/StaffContactsPersonal.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@TableName("staff_contacts_personal")
@Data
public class StaffContactsPersonal {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
//    /**
//     * ç”¨æˆ·ID(所属者)
//     */
//    @ApiModelProperty("用户ID(所属者)")
//    private Integer userId;
    /**
     * å‘˜å·¥ID
     */
    @ApiModelProperty("员工ID")
    private Integer contactId;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/collaborativeApproval/service/StaffContactsPersonalService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.collaborativeApproval.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
public interface StaffContactsPersonalService extends IService<StaffContactsPersonal> {
    IPage listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO);
}
src/main/java/com/ruoyi/collaborativeApproval/service/impl/StaffContactsPersonalServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.collaborativeApproval.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO;
import com.ruoyi.collaborativeApproval.mapper.StaffContactsPersonalMapper;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
import com.ruoyi.collaborativeApproval.service.StaffContactsPersonalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class StaffContactsPersonalServiceImpl extends ServiceImpl<StaffContactsPersonalMapper, StaffContactsPersonal> implements StaffContactsPersonalService {
    @Autowired
    private StaffContactsPersonalMapper staffContactsPersonalMapper;
    @Override
    public IPage listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO) {
        return staffContactsPersonalMapper.listPage(page, staffContactsPersonalDTO);
    }
}
src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.dto.DeviceRepairDto;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.device.service.DeviceDefectRecordService;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Api(tags = "设备缺陷记录管理")
@RequestMapping("/defect")
@RestController
public class DeviceDefectRecordController {
    @Autowired
    private DeviceDefectRecordService deviceDefectRecordService;
    @ApiModelProperty("设备缺陷记录列表")
    @GetMapping("/page")
    public AjaxResult page(Page page , DeviceDefectRecordDto deviceDefectRecordDto) {
        return AjaxResult.success(deviceDefectRecordService.listPage(page,deviceDefectRecordDto));
    }
    @ApiModelProperty("设备id查询设备缺陷记录列表")
    @GetMapping("/find/{deviceLedgerId}")
    public AjaxResult find(@PathVariable Long deviceLedgerId) {
        DeviceDefectRecordDto deviceDefectRecordDto = new DeviceDefectRecordDto();
        deviceDefectRecordDto.setDeviceLedgerId(deviceLedgerId);
        return AjaxResult.success(deviceDefectRecordService.listPage(new Page<>(1,-1),deviceDefectRecordDto));
    }
    @PostMapping("/add")
    @ApiModelProperty("添加设备缺陷记录")
    public AjaxResult add(@RequestBody DeviceDefectRecord deviceDefectRecord) {
        return AjaxResult.success(deviceDefectRecordService.add(deviceDefectRecord));
    }
    @PostMapping("/update")
    @ApiModelProperty("修改设备缺陷记录")
    public AjaxResult update(@RequestBody DeviceDefectRecord deviceDefectRecord) {
        return AjaxResult.success(deviceDefectRecordService.updateByDDR(deviceDefectRecord));
    }
    @DeleteMapping("/delete")
    @ApiModelProperty("删除设备缺陷记录")
    public AjaxResult delete(@PathVariable Long id) {
        return AjaxResult.success(deviceDefectRecordService.removeById(id));
    }
}
src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
@@ -37,9 +37,6 @@
    @PostMapping()
    @ApiModelProperty("添加设备报修")
    public AjaxResult add( @RequestBody DeviceRepair deviceRepair) {
        DeviceLedger byId = deviceLedgerService.getById(deviceRepair.getDeviceLedgerId());
        deviceRepair.setDeviceName(byId.getDeviceName());
        deviceRepair.setDeviceModel(byId.getDeviceModel());
        return deviceRepairService.saveDeviceRepair(deviceRepair);
    }
src/main/java/com/ruoyi/device/dto/DeviceDefectRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DeviceDefectRecordDto extends DeviceDefectRecord {
    @ApiModelProperty("设备名称")
    private String deviceName;
    @ApiModelProperty("设备型号")
    private String deviceModel;
}
src/main/java/com/ruoyi/device/mapper/DeviceDefectRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface DeviceDefectRecordMapper extends BaseMapper<DeviceDefectRecord> {
    IPage<DeviceDefectRecordDto> listPage(Page page,@Param("deviceDefectRecordDto") DeviceDefectRecordDto deviceDefectRecordDto);
}
src/main/java/com/ruoyi/device/pojo/DeviceDefectRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
@TableName("device_defect_record")
public class DeviceDefectRecord {
    @ApiModelProperty("设备缺陷记录id")
    private Long id;
    @ApiModelProperty("设备台账id")
    private Long deviceLedgerId;
    @ApiModelProperty("缺陷描述")
    private String defectDescription;
    @ApiModelProperty("状态")
    private String status;
    @ApiModelProperty("消除时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime eliminateTime;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/device/service/DeviceDefectRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.pojo.DeviceDefectRecord;
public interface DeviceDefectRecordService extends IService<DeviceDefectRecord> {
    IPage<DeviceDefectRecordDto> listPage(Page page, DeviceDefectRecordDto deviceDefectRecordDto);
    boolean updateByDDR(DeviceDefectRecord deviceDefectRecord);
    boolean add(DeviceDefectRecord deviceDefectRecord);
}
src/main/java/com/ruoyi/device/service/impl/DeviceDefectRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.mapper.DeviceDefectRecordMapper;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.device.service.DeviceDefectRecordService;
import com.ruoyi.device.service.IDeviceRepairService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Date;
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceDefectRecordServiceImpl extends ServiceImpl<DeviceDefectRecordMapper, DeviceDefectRecord> implements DeviceDefectRecordService {
    @Autowired
    private DeviceDefectRecordMapper deviceDefectRecordMapper;
    @Autowired
    private IDeviceRepairService deviceRepairService;
    @Override
    public IPage<DeviceDefectRecordDto> listPage(Page page, DeviceDefectRecordDto deviceDefectRecordDto) {
        return deviceDefectRecordMapper.listPage(page, deviceDefectRecordDto);
    }
    @Override
    public boolean add(DeviceDefectRecord deviceDefectRecord) {
        String status = deviceDefectRecord.getStatus();
        if (status.equals("严重缺陷")) {
            DeviceRepair deviceRepair = new DeviceRepair();
            deviceRepair.setDeviceLedgerId(deviceDefectRecord.getDeviceLedgerId());
            deviceRepair.setRemark(deviceDefectRecord.getDefectDescription());
            //获取当前登录用户
            deviceRepair.setRepairName(SecurityUtils.getUsername());
            deviceRepair.setRepairTime(new Date());
            deviceRepairService.saveDeviceRepair(deviceRepair);
            return deviceDefectRecordMapper.insert(deviceDefectRecord) > 0;
        } else if (status.equals("一般缺陷")) {
            return deviceDefectRecordMapper.insert(deviceDefectRecord) > 0;
        }
        return false;
    }
    @Override
    public boolean updateByDDR(DeviceDefectRecord deviceDefectRecord) {
        String status = deviceDefectRecord.getStatus();
        if (status.equals("严重缺陷")) {
//            deviceDefectRecord.setStatus("正常");
//            deviceDefectRecord.setEliminateTime(LocalDateTime.now());
            throw new RuntimeException("严重缺陷-设备维修后更新为正常状态");
        } else if (status.equals("一般缺陷")) {
            deviceDefectRecord.setStatus("正常");
        }
        deviceDefectRecord.setEliminateTime(LocalDateTime.now());
        return updateById(deviceDefectRecord);
    }
}
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -5,10 +5,16 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.dto.DeviceRepairDto;
import com.ruoyi.device.execl.DeviceRepairExeclDto;
import com.ruoyi.device.mapper.DeviceDefectRecordMapper;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.device.service.DeviceDefectRecordService;
import com.ruoyi.device.service.IDeviceLedgerService;
import com.ruoyi.device.service.IDeviceRepairService;
import com.ruoyi.framework.web.domain.AjaxResult;
import lombok.AllArgsConstructor;
@@ -26,10 +32,12 @@
@Slf4j
public class DeviceRepairServiceImpl extends ServiceImpl<DeviceRepairMapper, DeviceRepair> implements IDeviceRepairService {
    @Autowired
    private DeviceDefectRecordService deviceDefectRecordService;
    @Autowired
    private DeviceRepairMapper deviceRepairMapper;
    @Autowired
    private IDeviceLedgerService deviceLedgerService;
    @Override
    public IPage<DeviceRepairDto> queryPage(Page page, DeviceRepairDto deviceRepairDto) {
@@ -38,6 +46,9 @@
    @Override
    public AjaxResult saveDeviceRepair(DeviceRepair deviceRepair) {
        DeviceLedger byId = deviceLedgerService.getById(deviceRepair.getDeviceLedgerId());
        deviceRepair.setDeviceName(byId.getDeviceName());
        deviceRepair.setDeviceModel(byId.getDeviceModel());
        boolean save = this.save(deviceRepair);
        if (save){
            return AjaxResult.success();
@@ -48,6 +59,18 @@
    @Override
    public AjaxResult updateDeviceRepair(DeviceRepair deviceRepair) {
        if (this.updateById(deviceRepair)) {
            Long id = deviceRepair.getId();
            //
            DeviceDefectRecordDto deviceDefectRecordDto = new DeviceDefectRecordDto();
            deviceDefectRecordDto.setDeviceLedgerId(id);
            deviceDefectRecordDto.setStatus("严重缺陷");
            List<DeviceDefectRecordDto> records = deviceDefectRecordService.listPage(new Page<>(1, -1), deviceDefectRecordDto).getRecords();
            if (!records.isEmpty()){
                records.forEach(deviceDefectRecord -> {
                    deviceDefectRecord.setStatus("正常");
                    deviceDefectRecordService.updateByDDR(deviceDefectRecord);
                });
            }
            return AjaxResult.success();
        }
        return AjaxResult.error();
src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.measuringinstrumentledger.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto;
import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import com.ruoyi.measuringinstrumentledger.service.SparePartsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/spareParts")
@Api(tags = "备件分类接口")
public class SparePartsController {
    @Autowired
    private SparePartsService sparePartsService;
    @GetMapping("/getTree")
    @ApiOperation("备件分类-树结构")
    public AjaxResult getTree(){
        List<SparePartsDto> tree = sparePartsService.getTree();
        return AjaxResult.success(tree);
    }
    @GetMapping("/listPage")
    @ApiOperation("备件分类-分页查询")
    public AjaxResult listPage(Page page, SpareParts spareParts){
        IPage<SparePartsDto> listPage = sparePartsService.listPage(page, spareParts);
        return AjaxResult.success(listPage);
    }
//    @GetMapping("/list")
//    @ApiOperation("备件分类-查询所有")
//    public AjaxResult list(){
//        return AjaxResult.success(sparePartsService.list());
//    }
    @PostMapping("/add")
    @ApiOperation("备件分类-添加")
    @Log(title = "备件分类-添加", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody SpareParts spareParts){
        return AjaxResult.success(sparePartsService.save(spareParts));
    }
    @PostMapping("/update")
    @ApiOperation("备件分类-更新")
    @Log(title = "备件分类-更新", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody SpareParts spareParts){
        return AjaxResult.success(sparePartsService.updateById(spareParts));
    }
    @DeleteMapping("/delete/{id}")
    @ApiOperation("备件分类-删除")
    @Log(title = "备件分类-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@PathVariable Long id){
        return AjaxResult.success(sparePartsService.removeById(id));
    }
}
src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.measuringinstrumentledger.dto;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import lombok.Data;
import java.util.List;
@Data
public class SparePartsDto extends SpareParts {
    /**
     * å¤‡ä»¶åˆ†ç±»çˆ¶åç§°
     */
    private String parentName;
    private List<SparePartsDto> children;
}
src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.measuringinstrumentledger.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SparePartsMapper extends BaseMapper<SpareParts> {
    IPage<SparePartsDto> listPage(Page page,@Param("spareParts") SpareParts spareParts);
}
src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.measuringinstrumentledger.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
@TableName("spare_parts")
public class SpareParts {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å¤‡ä»¶åˆ†ç±»åç§°
     */
    private String name;
    /**
     * å¤‡ä»¶åˆ†ç±»ç¼–号
     */
    private String sparePartsNo;
    /**
     * å¤‡ä»¶çˆ¶id
     */
    private Long parentId;
    /**
     * å¤‡ä»¶çŠ¶æ€
     */
    private String status;
    /**
     * å¤‡ä»¶åˆ†ç±»æè¿°
     */
    private String description;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.measuringinstrumentledger.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import java.util.List;
public interface SparePartsService extends IService<SpareParts> {
    IPage<SparePartsDto> listPage(Page page, SpareParts spareParts);
    List<SparePartsDto> getTree();
}
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.measuringinstrumentledger.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto;
import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import com.ruoyi.measuringinstrumentledger.service.SparePartsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class SparePartsServiceImpl extends ServiceImpl<SparePartsMapper, SpareParts> implements SparePartsService {
    @Autowired
    private SparePartsMapper sparePartsMapper;
    @Override
    public IPage<SparePartsDto> listPage(Page page, SpareParts spareParts) {
        return sparePartsMapper.listPage(page,spareParts);
    }
    @Override
    public List<SparePartsDto> getTree() {
        SpareParts spareParts = new SpareParts();
        IPage<SparePartsDto> sparePartsDtoIPage = sparePartsMapper.listPage(new Page<>(1, -1), spareParts);
        List<SparePartsDto> records = sparePartsDtoIPage.getRecords();
        return buildTree(records);
    }
    /**
     * å°†æ‰å¹³ç»“构数据转换为树形结构
     * @param flatData æ‰å¹³èŠ‚ç‚¹åˆ—è¡¨
     * @return æ ‘形结构根节点列表
     */
    public static List<SparePartsDto> buildTree(List<SparePartsDto> flatData) {
        List<SparePartsDto> result = new ArrayList<>();
        if (flatData == null || flatData.isEmpty()) {
            return result;  // ç©ºè¾“入直接返回空列表
        }
        // 1. åˆ›å»ºèŠ‚ç‚¹æ˜ å°„è¡¨ï¼Œå­˜å‚¨æ‰€æœ‰èŠ‚ç‚¹å¹¶åˆå§‹åŒ–å­èŠ‚ç‚¹åˆ—è¡¨
        Map<Long, SparePartsDto> nodeMap = new HashMap<>();
        for (SparePartsDto node : flatData) {
            // ç¡®ä¿å­èŠ‚ç‚¹åˆ—è¡¨åˆå§‹åŒ–(避免空指针异常)
            if (node.getChildren() == null) {
                node.setChildren(new ArrayList<>());
            }
            nodeMap.put(node.getId(), node);
        }
        // 2. æž„建树形结构
        for (SparePartsDto node : flatData) {
            Long parentId = node.getParentId();
            if (parentId == null || !nodeMap.containsKey(parentId)) {
                // æ— çˆ¶èŠ‚ç‚¹æˆ–çˆ¶èŠ‚ç‚¹ä¸å­˜åœ¨ï¼Œä½œä¸ºæ ¹èŠ‚ç‚¹
                result.add(node);
            } else {
                // æœ‰çˆ¶èŠ‚ç‚¹ï¼Œæ·»åŠ åˆ°çˆ¶èŠ‚ç‚¹çš„å­èŠ‚ç‚¹åˆ—è¡¨
                SparePartsDto parentNode = nodeMap.get(parentId);
                parentNode.getChildren().add(node);
            }
        }
        return result;
    }
}
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -80,6 +80,11 @@
        IPage<ProcurementPageDtoCopy> result =procurementRecordService.listPageCopy(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/getReportList")
    @Log(title = "库存报表查询", businessType = BusinessType.OTHER)
    public AjaxResult getReportList(Page page, ProcurementPageDto procurementDto) {
        return AjaxResult.success(procurementRecordService.getReportList(page, procurementDto));
    }
    /**
     * å¯¼å‡º
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
@@ -57,6 +57,11 @@
    private BigDecimal quantity;
    /**
     * æœ€ä½Žåº“存数量
     */
    @Excel(name = "最低库存数量")
    private BigDecimal minStock;
    /**
     * å¾…入库数量
     */
    @Excel(name = "待入库数量")
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -1,10 +1,13 @@
package com.ruoyi.procurementrecord.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -112,5 +115,35 @@
     */
    @Excel(name = "不含税总价")
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * æŠ¥è¡¨æ—¥æŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate reportDate;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startMonth;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endMonth;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -5,6 +5,7 @@
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -43,7 +44,11 @@
    @Excel(name = "待出库数量")
    private BigDecimal inboundNum0;
    /**
     * æœ€ä½Žåº“存数量
     */
    @Excel(name = "最低库存数量")
    private BigDecimal minStock;
    /**
     * å‡ºå…¥åº“æ—¶é—´
     */
@@ -124,5 +129,35 @@
     */
    @Excel(name = "不含税总价")
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * æŠ¥è¡¨æ—¥æŠ¥
     */
    @Excel(name = "报表日报")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate reportDate;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @Excel(name = "报表月报开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate startMonth;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @Excel(name = "报表月报结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate endMonth;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @Excel(name = "报表作业开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate startDate;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @Excel(name = "报表作业结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate endDate;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -35,12 +35,17 @@
     * å…¥åº“数量
     */
    private BigDecimal inboundNum;
//    /**
//     * æœ€ä½Žåº“存数量
//     */
//    private BigDecimal minStock;
    /**
     * å…¥åº“用户
     */
    private String createBy;
    /**
     * å…¥åº“用户id
     */
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -8,6 +8,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * @author :yys
@@ -31,4 +32,6 @@
    int updateManagement(ProcurementManagementUpdateDto procurementDto);
    void exportCopy(HttpServletResponse response);
    Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -4,7 +4,6 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
@@ -17,7 +16,6 @@
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -25,9 +23,10 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -231,6 +230,104 @@
    }
    @Override
    public Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto) {
        // æž„建报表数据结构
        Map<String, Object> reportData = new HashMap<>();
        // 2. æž„建图表数据
        Map<String, Object> chartData = new HashMap<>();
        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopy(page, procurementDto);
        List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords();
        // è®¡ç®—待入库数量
        reportData.put("tableData", procurementPageDtoCopyList);
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(collect)){
             return reportData;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
             return reportData;
        }
        int totalIn =0;
        int totalOut =0;
        int currentStock =0;
        int turnoverRate =0;
        List<String> dates = new ArrayList<>();
        List<Integer> values = new ArrayList<>();
        List<String> comparisonDates = new ArrayList<>();
        List<Integer> inValues = new ArrayList<>();
        List<Integer> outValues = new ArrayList<>();
        // å®šä¹‰æ—¥æœŸæ ¼å¼åŒ–器,指定为yyyy-MM-dd格式
        DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
            dates.add(dto.getCreateTime().format(dateFormatter));
            comparisonDates.add(dto.getCreateTime().format(dateFormatter));
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
            // è®¡ç®—总入库数量
            totalIn += dto.getInboundNum().intValue();
            inValues.add(totalIn);
            // è®¡ç®—总出库数量
            totalOut += totalInboundNum.intValue();
            outValues.add(totalOut);
            // è®¡ç®—当前库存
            currentStock += dto.getInboundNum().intValue() - totalInboundNum.intValue();
            values.add(currentStock);
            // è®¡ç®—周转率
            if(totalIn > 0){
                turnoverRate = totalOut * 100 / totalIn;
            }
        }
        // 1. æž„建汇总数据
        Map<String, Object> summary = new HashMap<>();
        summary.put("totalIn", totalIn);          // æ€»å…¥åº“量,实际应从数据计算
        summary.put("totalOut", totalOut);         // æ€»å‡ºåº“量,实际应从数据计算
        summary.put("currentStock", currentStock);     // å½“前库存量,实际应从数据计算
        summary.put("turnoverRate", turnoverRate);      // å‘¨è½¬çŽ‡ï¼Œå®žé™…åº”ä»Žæ•°æ®è®¡ç®—
        reportData.put("summary", summary);
        // 2. æž„建图表数据
//        Map<String, Object> chartData = new HashMap<>();
//        List<String> dates = Arrays.asList("2025-09-15", "2025-09-16", "2025-09-17", "2025-09-18", "2025-09-19");
//        List<Integer> values = Arrays.asList(300, 350, 400, 380, 420);
        chartData.put("dates", dates);
        chartData.put("values", values);
        chartData.put("comparisonDates", comparisonDates);  // å®žé™…应从数据计算
        chartData.put("inValues", inValues);         // å®žé™…应从数据计算
        chartData.put("outValues", outValues);        // å®žé™…应从数据计算
        reportData.put("chartData", chartData);
        // 3. è®¾ç½®è¡¨æ ¼æ•°æ®
        reportData.put("tableData", procurementPageDtoCopyList);
        return reportData;
    }
    @Override
    public int add(ProcurementAddDto procurementDto) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        // æ‰¹é‡æ–°å¢ž
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -1,5 +1,6 @@
package com.ruoyi.sales.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,6 +13,11 @@
import com.ruoyi.sales.dto.InvoiceLedgerDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.mapper.InvoiceLedgerMapper;
import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
import com.ruoyi.sales.pojo.InvoiceLedger;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.pojo.ReceiptPayment;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.service.ICommonFileService;
import com.ruoyi.sales.service.ISalesLedgerService;
@@ -22,6 +28,7 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -44,6 +51,12 @@
    @Autowired
    private InvoiceLedgerMapper invoiceLedgerMapper;
    @Autowired
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    @Autowired
    private ReceiptPaymentMapper receiptPaymentMapper;
    /**
     * æŸ¥è¯¢é”€å”®å°è´¦åˆ—表
     */
@@ -65,10 +78,10 @@
                if (salesLedger.getId().intValue() == invoiceLedgerDto.getSalesLedgerId()) {
                    BigDecimal noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal());
                    salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal);
                }
            }
        }
                }
            }
        }
        return getDataTable(list);
    }
@@ -181,6 +194,17 @@
            iPage.setTotal(iPage.getRecords().size());
            return iPage;
        }
        // è®¡ç®—回款金额,待回款金额
        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(new LambdaQueryWrapper<InvoiceRegistrationProduct>()
                .in(InvoiceRegistrationProduct::getSalesLedgerId, salesLedgerIds));
        List<InvoiceLedger> invoiceLedgers = invoiceLedgerMapper.selectList(new LambdaQueryWrapper<InvoiceLedger>()
                .in(InvoiceLedger::getInvoiceRegistrationProductId, invoiceRegistrationProducts.stream().map(InvoiceRegistrationProduct::getId).collect(Collectors.toList())));
        List<ReceiptPayment> receiptPayments = new ArrayList<>();
        if(!CollectionUtils.isEmpty(invoiceLedgers)){
            receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>()
                    .in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgers.stream().map(InvoiceLedger::getId).collect(Collectors.toList())));
        }
        for (SalesLedger salesLedger : iPage.getRecords()) {
            boolean existFlag = false;
            BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO;
@@ -190,6 +214,26 @@
                    noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal());
                    invoiceTotal = invoiceLedgerDto.getInvoiceTotal();
                    existFlag = true;
                    if(!CollectionUtils.isEmpty(receiptPayments)){
                        List<InvoiceRegistrationProduct> collect = invoiceRegistrationProducts.stream()
                                .filter(item -> salesLedger.getId().equals(Long.parseLong(item.getSalesLedgerId().toString())))
                                .collect(Collectors.toList());
                        List<Integer> collect1 = collect.stream()
                                .map(InvoiceRegistrationProduct::getId).collect(Collectors.toList());
                        List<InvoiceLedger> collect2 = invoiceLedgers.stream()
                                .filter(item -> collect1.contains(item.getInvoiceRegistrationProductId()))
                                .collect(Collectors.toList());
                        // èŽ·å–å·²å›žæ¬¾é‡‘é¢
                        List<ReceiptPayment> collect3 = receiptPayments.stream()
                                .filter(item -> collect2.stream().anyMatch(item1 -> item1.getId().equals(item.getInvoiceLedgerId())))
                                .collect(Collectors.toList());
                        BigDecimal receiptPaymentAmountTotal = collect3.stream().map(ReceiptPayment::getReceiptPaymentAmount)
                                .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
                        // èŽ·å–å¾…å›žæ¬¾é‡‘é¢
                        BigDecimal noReceiptPaymentAmountTotal = invoiceLedgerDto.getInvoiceTotal().subtract(receiptPaymentAmountTotal);
                        salesLedger.setReceiptPaymentAmountTotal(receiptPaymentAmountTotal);
                        salesLedger.setNoReceiptAmount(noReceiptPaymentAmountTotal);
                    }
                    break;
                }
            }
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.sales.controller;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.service.SalesQuotationService;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/sales/quotation")
public class SalesQuotationController {
    @Autowired
    private SalesQuotationService salesQuotationService;
    @GetMapping("/list")
    public AjaxResult getList(Page page, SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.listPage(page, salesQuotationDto));
    }
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.add(salesQuotationDto));
    }
    @PostMapping("/update")
    public AjaxResult update(@RequestBody SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.edit(salesQuotationDto));
    }
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody Long id) {
        return AjaxResult.success(salesQuotationService.delete(id));
    }
}
src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java
@@ -1,13 +1,16 @@
package com.ruoyi.sales.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.ReceiptPayment;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
@Data
public class ReceiptPaymentDto extends ReceiptPayment {
@@ -20,6 +23,12 @@
    @Excel(name = "客户名称")
    private String customerName;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "开票日期",width = 30,dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "开票日期")
    private Date invoiceDate;
    @ApiModelProperty(value = "查询文本")
    private String searchText;
src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.sales.dto;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class SalesQuotationDto extends SalesQuotation {
    @ApiModelProperty(value = "报价商品")
    private List<SalesQuotationProduct> products;
}
src/main/java/com/ruoyi/sales/mapper/SalesQuotationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.sales.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.data.repository.query.Param;
@Mapper
public interface SalesQuotationMapper extends BaseMapper<SalesQuotation> {
    IPage<SalesQuotationDto> listPage(Page page,@Param("salesQuotationDto") SalesQuotationDto salesQuotationDto);
}
src/main/java/com/ruoyi/sales/mapper/SalesQuotationProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.sales.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SalesQuotationProductMapper extends BaseMapper<SalesQuotationProduct> {
//    List<SalesQuotationProduct> selectBySalesQuotationIds(List<Long> salesQuotationIds);
    List<SalesQuotationProduct> selectBySalesQuotationId(@Param("id") Long id);
}
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -113,6 +113,14 @@
    @ApiModelProperty(value = "已开票金额(元)")
    private BigDecimal invoiceTotal;
    @TableField(exist = false)
    @ApiModelProperty(value = "回款金额")
    private BigDecimal receiptPaymentAmountTotal = BigDecimal.ZERO;
    @TableField(exist = false)
    @ApiModelProperty(value = "待回款金额")
    private BigDecimal noReceiptAmount = BigDecimal.ZERO;
    @ApiModelProperty(value = "付款方式")
    private String paymentMethod;
}
src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@TableName("sales_quotation")
public class SalesQuotation {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "报价单编号")
    private String quotationNo;
    @ApiModelProperty(value = "客户名称")
    private String customer;
    @ApiModelProperty(value = "业务员")
    private String salesperson;
    @ApiModelProperty(value = "报价日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate quotationDate;
    @ApiModelProperty(value = "有效期至")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate validDate;
    @ApiModelProperty(value = "付款方式")
    private String paymentMethod;
    @ApiModelProperty(value = "交货周期天数")
    private String deliveryPeriod;
    @ApiModelProperty(value = "状态")
    private String status;
    @ApiModelProperty(value = "报价总金额")
    private Double totalAmount;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("sales_quotation_product")
public class SalesQuotationProduct {
    @ApiModelProperty(value = "报价商品ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "销售报价单id")
    private Long salesQuotationId;
    @ApiModelProperty(value = "商品名称")
    private String product;
    @ApiModelProperty(value = "商品规格")
    private String specification;
    @ApiModelProperty(value = "单位")
    private String unit;
    @ApiModelProperty(value = "单价")
    private Double unitPrice;
    @ApiModelProperty(value = "数量")
    private Integer quantity;
    @ApiModelProperty(value = "金额")
    private Double amount;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/service/SalesQuotationProductService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.sales.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
public interface SalesQuotationProductService extends IService<SalesQuotationProduct> {
}
src/main/java/com/ruoyi/sales/service/SalesQuotationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.sales.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public interface SalesQuotationService extends IService<SalesQuotation> {
    IPage listPage(Page page, SalesQuotationDto salesQuotationDto);
    boolean add(SalesQuotationDto salesQuotationDto);
    boolean delete(Long id);
    boolean edit(SalesQuotationDto salesQuotationDto);
}
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationProductServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.sales.mapper.SalesQuotationProductMapper;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
import com.ruoyi.sales.service.SalesQuotationProductService;
import org.springframework.stereotype.Service;
@Service
public class SalesQuotationProductServiceImpl extends ServiceImpl<SalesQuotationProductMapper, SalesQuotationProduct> implements SalesQuotationProductService {
}
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.mapper.SalesQuotationMapper;
import com.ruoyi.sales.mapper.SalesQuotationProductMapper;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
import com.ruoyi.sales.service.SalesQuotationProductService;
import com.ruoyi.sales.service.SalesQuotationService;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Transactional(rollbackFor = Exception.class)
public class SalesQuotationServiceImpl extends ServiceImpl<SalesQuotationMapper, SalesQuotation> implements SalesQuotationService {
    @Autowired
    private SalesQuotationMapper salesQuotationMapper;
    @Autowired
    private SalesQuotationProductMapper salesQuotationProductMapper;
    @Autowired
    private SalesQuotationProductService salesQuotationProductService;
    @Override
    public IPage<SalesQuotationDto> listPage(Page page, SalesQuotationDto salesQuotationDto) {
        IPage<SalesQuotationDto> salesQuotationDtoIPage = salesQuotationMapper.listPage(page, salesQuotationDto);
        if(CollectionUtils.isEmpty(salesQuotationDtoIPage.getRecords())){
            return salesQuotationDtoIPage;
        }
        salesQuotationDtoIPage.getRecords().forEach(record -> {
            List<SalesQuotationProduct> products = salesQuotationProductMapper.selectBySalesQuotationId(record.getId());
            record.setProducts(products);
        });
        return salesQuotationDtoIPage;
    }
    @Override
    public boolean add(SalesQuotationDto salesQuotationDto) {
        SalesQuotation salesQuotation = new SalesQuotation();
        BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
        String quotationNo = salesQuotation.getQuotationNo();
        salesQuotationMapper.insert(salesQuotation);
//        if(salesQuotationMapper.insert(salesQuotation)!=1){
//            return false;
//        }
        if(CollectionUtils.isEmpty(salesQuotationDto.getProducts())){
            return true;
        }
        List<SalesQuotationProduct> products = salesQuotationDto.getProducts().stream().map(product -> {
            SalesQuotationProduct salesQuotationProduct = new SalesQuotationProduct();
            BeanUtils.copyProperties(product, salesQuotationProduct);
            salesQuotationProduct.setSalesQuotationId(salesQuotationMapper.selectOne(new LambdaQueryWrapper<SalesQuotation>().eq(SalesQuotation::getQuotationNo, quotationNo)).getId());
            return salesQuotationProduct;
        }).collect(Collectors.toList());
        salesQuotationProductService.saveBatch(products);
        return true;
    }
    @Override
    public boolean edit(SalesQuotationDto salesQuotationDto) {
        SalesQuotation salesQuotation = new SalesQuotation();
        BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
        if(salesQuotationMapper.updateById(salesQuotation)!=1){
            return false;
        }
        salesQuotationProductMapper.delete(new LambdaQueryWrapper<SalesQuotationProduct>().eq(SalesQuotationProduct::getSalesQuotationId, salesQuotationDto.getId()));
        if(CollectionUtils.isEmpty(salesQuotationDto.getProducts())){
            return true;
        }
        List<SalesQuotationProduct> products = salesQuotationDto.getProducts().stream().map(product -> {
            SalesQuotationProduct salesQuotationProduct = new SalesQuotationProduct();
            BeanUtils.copyProperties(product, salesQuotationProduct);
            salesQuotationProduct.setSalesQuotationId(salesQuotation.getId());
            return salesQuotationProduct;
        }).collect(Collectors.toList());
        salesQuotationProductService.saveBatch(products);
        return true;
    }
    @Override
    public boolean delete(Long id) {
        salesQuotationMapper.deleteById(id);
        salesQuotationProductMapper.delete(new LambdaQueryWrapper<SalesQuotationProduct>().eq(SalesQuotationProduct::getSalesQuotationId, id));
        return true;
    }
}
src/main/resources/mapper/collaborativeApproval/StaffContactsPersonalMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
<?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="com.ruoyi.collaborativeApproval.mapper.StaffContactsPersonalMapper">
    <select id="listPage" resultType="com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO">
        SELECT
            scp.id,
            scp.contact_id,
            sjlr.staff_no,
            sjlr.staff_name,
            sjlr.sex,
            sjlr.post_job,
            sjlr.adress,
            sjlr.profession,
            sjlr.identity_card,
            sjlr.phone,
            scp.create_time
        FROM staff_contacts_personal scp
            LEFT JOIN (select * from staff_join_leave_record WHERE staff_state = 1) sjlr ON scp.contact_id=sjlr.id
        where 1=1
        <if test="staffContactsPersonalDTO.staffName != null and staffContactsPersonalDTO.staffName != ''">
            and sjlr.staff_name like concat('%',#{staffContactsPersonalDTO.staffName},'%')
        </if>
    </select>
</mapper>
src/main/resources/mapper/device/DeviceDefectRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
<?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="com.ruoyi.device.mapper.DeviceDefectRecordMapper">
    <select id="listPage" resultType="com.ruoyi.device.dto.DeviceDefectRecordDto">
        select ddr.*,dl.device_name,dl.device_model
        from device_defect_record ddr
        left join device_ledger dl on ddr.device_ledger_id = dl.id
        <where>
            1=1
            <if test="deviceDefectRecordDto.deviceLedgerId != null">
                and ddr.device_ledger_id = #{deviceDefectRecordDto.deviceLedgerId}
            </if>
            <if test="deviceDefectRecordDto.deviceName != null and deviceDefectRecordDto.deviceName != ''">
                and dl.device_name like concat('%',#{deviceDefectRecordDto.deviceName},'%')
            </if>
            <if test="deviceDefectRecordDto.status != null">
                and ddr.status = #{deviceDefectRecordDto.status}
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<?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="com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper">
    <select id="listPage" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsDto">
        select sp.*,sp1.name as parentName from spare_parts sp
        left join spare_parts sp1 on sp1.id = sp.parent_id
        <where>
            <if test="spareParts.name != null">
                and name like concat('%',#{spareParts.name},'%')
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -11,6 +11,7 @@
            t2.specification_model,
            t2.unit,
            t2.quantity,
            t2.min_stock,
            t2.quantity as quantity0,
            t2.tax_rate,
            t2.tax_inclusive_unit_price,
@@ -89,6 +90,7 @@
        t1.create_user,
        t2.specification_model,
        t2.unit,
        t2.min_stock,
        t2.tax_rate,
        t2.tax_inclusive_unit_price,
        t2.tax_inclusive_total_price,
@@ -107,6 +109,21 @@
            <if test="req.supplierName != null and req.supplierName != ''">
                and t3.supplier_name like  concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.reportDate != null">
                and t1.create_time >= #{req.reportDate} and t1.create_time &lt; DATE_ADD(#{req.reportDate}, INTERVAL 1 DAY)
            </if>
            <if test="req.startMonth != null">
                and t1.create_time >= #{req.startMonth}
            </if>
            <if test="req.endMonth != null">
                and t1.create_time &lt;= #{req.endMonth}
            </if>
            <if test="req.startDate != null">
                and t1.create_time >= #{req.startDate}
            </if>
            <if test="req.endDate != null">
                and t1.create_time &lt;= #{req.endDate}
            </if>
        </where>
    </select>
    <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
src/main/resources/mapper/sales/SalesQuotationMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -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="com.ruoyi.sales.mapper.SalesQuotationMapper">
    <select id="listPage" resultType="com.ruoyi.sales.dto.SalesQuotationDto">
        SELECT * FROM sales_quotation
        WHERE 1=1
        <if test="salesQuotationDto.quotationNo != null and salesQuotationDto.quotationNo != '' ">
            AND quotation_no LIKE CONCAT('%',#{salesQuotationDto.quotationNo},'%')
        </if>
        <if test="salesQuotationDto.customer != null and salesQuotationDto.customer != '' ">
            AND customer = #{salesQuotationDto.customer}
        </if>
        <if test="salesQuotationDto.status != null and salesQuotationDto.status != '' ">
            AND status = #{salesQuotationDto.status}
        </if>
    </select>
</mapper>
src/main/resources/mapper/sales/SalesQuotationProductMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
<?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="com.ruoyi.sales.mapper.SalesQuotationProductMapper">
<!--    <select id="selectBySalesQuotationIds" resultType="com.ruoyi.sales.pojo.SalesQuotationProduct">-->
<!--        select * from sales_quotation_product where sales_quotation_id in-->
<!--        <foreach collection="salesQuotationIds" item="salesQuotationId" open="(" close=")" separator=",">-->
<!--            #{salesQuotationId}-->
<!--        </foreach>-->
<!--    </select>-->
    <select id="selectBySalesQuotationId" resultType="com.ruoyi.sales.pojo.SalesQuotationProduct">
        select * from sales_quotation_product where sales_quotation_id = #{id}
    </select>
</mapper>