feat(sip): 添加合同清单导出导入功能

- 在 IOrderInfoService 接口中添加了 listExport 和 listImportData 方法
- 在 OrderInfoController 中添加了对应的控制器方法
- 在 OrderInfoMapper 中添加了 listExport 方法的 SQL 查询
- 在 OrderInfoServiceImpl 中实现了 listExport 和 listImportData 方法的逻辑
- 修改了 OrderList 类,将 discount 字段标记为 Excel 导出的字段
master
chenhao 2025-05-16 15:14:32 +08:00
parent d7cc90be9d
commit 772064bee1
7 changed files with 114 additions and 19 deletions

View File

@ -24,11 +24,11 @@
</dependency>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <optional>true</optional> &lt;!&ndash; 表示依赖不会传递 &ndash;&gt;-->
<!-- </dependency>-->
<!-- swagger3-->
<dependency>

View File

@ -2,6 +2,7 @@ package com.ruoyi.sip.controller;
import java.util.List;
import com.ruoyi.sip.domain.DeliveryList;
import com.ruoyi.sip.domain.MaintenanceRecordsDto;
import com.ruoyi.sip.domain.OrderList;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@ -17,6 +18,7 @@ import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* Controller
@ -132,4 +134,23 @@ public class OrderInfoController extends BaseController
{
return AjaxResult.success(orderInfoService.selectOrderInfoByMaintenance(dto));
}
@RequiresPermissions("sip:list:export")
@Log(title = "发货清单", businessType = BusinessType.EXPORT)
@PostMapping("/list/export")
@ResponseBody
public AjaxResult listExport(OrderList orderList) {
List<OrderList> list = orderInfoService.listExport(orderList);
ExcelUtil<OrderList> util = new ExcelUtil<OrderList>(OrderList.class);
return util.exportExcel(list, "合同清单数据");
}
@PostMapping("/list/importData")
@ResponseBody
public AjaxResult listImportData(MultipartFile file, Long orderId) throws Exception
{
ExcelUtil<OrderList> util = new ExcelUtil<OrderList>(OrderList.class);
List<OrderList> orderListList = util.importExcel(file.getInputStream());
return orderInfoService.listImportData(orderListList, orderId);
}
}

View File

@ -26,14 +26,14 @@ public class OrderList extends BaseEntity
private Long id;
/** 关联合同ID */
@Excel(name = "关联合同ID")
// @Excel(name = "关联合同ID")
private Long orderId;
/** 产品编码,关联产品编码表 */
@Excel(name = "BOM编码")
private String productCode;
@Excel(name = "产品名称")
// @Excel(name = "产品名称")
private String productName;
/** 数量 */
@ -43,27 +43,28 @@ public class OrderList extends BaseEntity
/** 单价 */
@Excel(name = "单价")
private BigDecimal price;
/** 优惠 */
@Excel(name = "折扣")
private BigDecimal discount;
/** 总价 */
@Excel(name = "总价")
private BigDecimal amount;
/** 优惠 */
private BigDecimal discount;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
// @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date createdAt;
/** 更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd")
// @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date updatedAt;
/** 删除时间,软删除 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "删除时间", width = 30, dateFormat = "yyyy-MM-dd")
// @Excel(name = "删除时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date deletedAt;
private ProductInfo productInfo;

View File

@ -2,6 +2,7 @@ package com.ruoyi.sip.mapper;
import java.util.List;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.sip.domain.MaintenanceRecordsDto;
import com.ruoyi.sip.domain.OrderInfo;
import com.ruoyi.sip.domain.OrderList;
@ -105,4 +106,7 @@ public interface OrderInfoMapper
List<OrderInfo> selectOrderInfoByMaintenance(MaintenanceRecordsDto dto);
List<OrderList> listMaintenanceByOrderIdList(List<Long> orderIdList);
List<OrderList> listExport(OrderList orderList);
}

View File

@ -2,6 +2,7 @@ package com.ruoyi.sip.service;
import java.util.List;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.sip.domain.MaintenanceRecordsDto;
import com.ruoyi.sip.domain.OrderInfo;
import com.ruoyi.sip.domain.OrderList;
@ -73,4 +74,8 @@ public interface IOrderInfoService
* @return
*/
List<OrderInfoVo> getOrderInfo(ApiDataQueryDto dto);
List<OrderList> listExport(OrderList orderList);
AjaxResult listImportData(List<OrderList> orderListList, Long orderId);
}

View File

@ -1,10 +1,13 @@
package com.ruoyi.sip.service.impl;
import java.util.Collections;
import java.util.List;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Dict;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.dto.ApiDataQueryDto;
@ -13,8 +16,7 @@ import com.ruoyi.sip.service.ICustomerInfoService;
import com.ruoyi.sip.vo.OrderInfoVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -186,6 +188,41 @@ public class OrderInfoServiceImpl implements IOrderInfoService
}).collect(Collectors.toList());
}
@Override
public List<OrderList> listExport(OrderList orderList) {
return orderInfoMapper.listExport(orderList);
}
@Override
public AjaxResult listImportData(List<OrderList> orderListList, Long orderId) {
Assert.notNull(orderId, "合同ID不能为空");
List<String> productCodeList = orderListList.stream().map(OrderList::getProductCode).filter(Objects::nonNull).collect(Collectors.toList());
if (productCodeList.isEmpty()) {
return AjaxResult.error("文件为空或产品编码为空");
}
for (OrderList orderList : orderListList) {
orderList.setOrderId(orderId);
if (orderList.getDiscount() != null && (orderList.getDiscount().compareTo(BigDecimal.ONE) > 0 || orderList.getDiscount().compareTo(BigDecimal.ZERO) <= 0)) {
return AjaxResult.error("折扣区间需在0-1之间");
}
if (orderList.getPrice() == null) {
return AjaxResult.error("单价不能为空");
}
if (orderList.getQuantity() == null) {
return AjaxResult.error("单价不能为空");
}
BigDecimal amount = orderList.getPrice().multiply(new BigDecimal(orderList.getQuantity()));
if (orderList.getDiscount()!=null){
amount = amount.multiply(orderList.getDiscount()).setScale(2, RoundingMode.HALF_UP);
}
orderList.setAmount(amount);
}
orderInfoMapper.deleteOrderListByOrderId(orderId);
orderInfoMapper.batchOrderList(orderListList);
return AjaxResult.success("导入成功");
}
/**
*
*/

View File

@ -128,6 +128,9 @@
t1.version_code,
t1.order_name,
t1.customer_name,
t1.customer_code,
t1.customer_address,
t1.customer_postcode,
t1.customer_contact,
t1.customer_phone,
t1.customer_email,
@ -207,6 +210,21 @@
#{item}
</foreach>
</select>
<select id="listExport" resultType="com.ruoyi.sip.domain.OrderList">
select id, order_id, product_code, quantity, price, amount,discount,remark, created_at, updated_at
from order_list
<where>
<if test="id!=null">
and id=#{id}
</if>
<if test="orderId!=null">
and order_id=#{orderId}
</if>
<if test="productCode!=null and productCode!=''">
and product_code=#{productCode}
</if>
</where>
</select>
<insert id="insertOrderInfo" parameterType="OrderInfo" useGeneratedKeys="true" keyProperty="id">
insert into order_info
@ -216,6 +234,9 @@
<if test="versionCode != null">version_code,</if>
<if test="orderName != null and orderName != ''">order_name,</if>
<if test="customerName != null and customerName != ''">customer_name,</if>
<if test="customerCode != null and customerCode != ''">customer_code,</if>
<if test="customerAddress != null and customerAddress != ''">customer_address,</if>
<if test="customerPostcode != null and customerPostcode != ''">customer_postcode,</if>
<if test="customerContact != null">customer_contact,</if>
<if test="customerPhone != null">customer_phone,</if>
<if test="customerEmail != null">customer_email,</if>
@ -233,6 +254,9 @@
<if test="versionCode != null">#{versionCode},</if>
<if test="orderName != null and orderName != ''">#{orderName},</if>
<if test="customerName != null and customerName != ''">#{customerName},</if>
<if test="customerCode != null and customerCode != ''">#{customerCode},</if>
<if test="customerAddress != null and customerAddress != ''">#{customerAddress},</if>
<if test="customerPostcode != null and customerPostcode != ''">#{customerPostcode},</if>
<if test="customerContact != null">#{customerContact},</if>
<if test="customerPhone != null">#{customerPhone},</if>
<if test="customerEmail != null">#{customerEmail},</if>
@ -257,6 +281,9 @@
<if test="customerContact != null">customer_contact = #{customerContact},</if>
<if test="customerPhone != null">customer_phone = #{customerPhone},</if>
<if test="customerEmail != null">customer_email = #{customerEmail},</if>
<if test="customerCode != null and customerCode != ''">customer_code=#{customerCode},</if>
<if test="customerAddress != null and customerAddress != ''">customer_address=#{customerAddress},</if>
<if test="customerPostcode != null and customerPostcode != ''">customer_postcode=#{customerPostcode},</if>
<if test="orderType != null">order_type = #{orderType},</if>
<if test="orderAgentCode != null">order_agent_code = #{orderAgentCode},</if>
<if test="orderPartnerCode != null">order_partner_code = #{orderPartnerCode},</if>
@ -318,9 +345,9 @@
</delete>
<insert id="batchOrderList">
insert into order_list( id, order_id, product_code, quantity, price, amount, remark, created_at, updated_at) values
insert into order_list(id , order_id, product_code, quantity, price, amount,discount,remark, created_at, updated_at) values
<foreach item="item" index="index" collection="list" separator=",">
( #{item.id}, #{item.orderId}, #{item.productCode}, #{item.quantity}, #{item.price}, #{item.amount},
( #{item.id}, #{item.orderId}, #{item.productCode}, #{item.quantity}, #{item.price}, #{item.amount},#{item.discount},
#{item.remark}, now(),now())
</foreach>
</insert>