Browse Source

[feat] 售后管理

按照万材要求,售后管理售后单新增导出功能,支持部分行和全部行导出,导出更多数据
新增导出所有和选择导出后端接口
新增 导出售后管理售后单明细方法
新增根据出货设备查询售后单集合方法
新增导出售后单明细
dev
liuxiaoxu 3 days ago
parent
commit
1ba5e8978d
  1. 23
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/controller/AftersalesOrderController.java
  2. 2
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/domain/AftersalesOrder.java
  3. 118
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/domain/vo/ExportAftersalesOrderVo.java
  4. 5
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesOrderMapper.java
  5. 12
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/IAftersalesOrderService.java
  6. 78
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/impl/AftersalesOrderServiceImpl.java
  7. 1
      ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesAftersalesNoticeDetailMapper.java
  8. 8
      ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesOrderMapper.xml
  9. 31
      ruoyi-admin/src/main/resources/templates/aftersales/aftersalesOrder/aftersalesOrder.html

23
ruoyi-admin/src/main/java/com/ruoyi/aftersales/controller/AftersalesOrderController.java

@ -2,6 +2,9 @@ package com.ruoyi.aftersales.controller;
import java.util.List; import java.util.List;
import com.ruoyi.aftersales.domain.AftersalesOutOrder;
import com.ruoyi.aftersales.domain.vo.ExportAftersalesOrderVo;
import com.ruoyi.aftersales.domain.vo.ExportAftersalesOutOrderVo;
import com.ruoyi.aftersales.domain.vo.SelectDeviceVO; import com.ruoyi.aftersales.domain.vo.SelectDeviceVO;
import com.ruoyi.aftersales.service.IAfterSalesShippingDeviceService; import com.ruoyi.aftersales.service.IAfterSalesShippingDeviceService;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
@ -86,11 +89,23 @@ public class AftersalesOrderController extends BaseController
@Log(title = "售后单", businessType = BusinessType.EXPORT) @Log(title = "售后单", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
@ResponseBody @ResponseBody
public AjaxResult export(AftersalesOrder aftersalesOrder) public AjaxResult export(AftersalesOrder aftersalesOrder,String ids)
{ {
List<AftersalesOrder> list = aftersalesOrderService.selectAftersalesOrderList(aftersalesOrder);
ExcelUtil<AftersalesOrder> util = new ExcelUtil<AftersalesOrder>(AftersalesOrder.class); if (org.springframework.util.StringUtils.isEmpty(ids)){
return util.exportExcel(list, "售后单数据");
List<AftersalesOrder> list = aftersalesOrderService.selectAftersalesOrderList(aftersalesOrder);
List<ExportAftersalesOrderVo> exportAftersalesOrderVos = aftersalesOrderService.exportAftersalesOrderList(list);
ExcelUtil<ExportAftersalesOrderVo> util = new ExcelUtil<ExportAftersalesOrderVo>(ExportAftersalesOrderVo.class);
return util.exportExcel(exportAftersalesOrderVos, "售后单数据");
}else {
String[] aftersalesOrderCodes = ids.split(",");
List<AftersalesOrder> list = aftersalesOrderService.selectAftersalesOrderByCodes(aftersalesOrderCodes);
List<ExportAftersalesOrderVo> exportAftersalesOrderVos = aftersalesOrderService.exportAftersalesOrderList(list);
ExcelUtil<ExportAftersalesOrderVo> util = new ExcelUtil<ExportAftersalesOrderVo>(ExportAftersalesOrderVo.class);
return util.exportExcel(exportAftersalesOrderVos, "售后单数据");
}
} }
/** /**

2
ruoyi-admin/src/main/java/com/ruoyi/aftersales/domain/AftersalesOrder.java

@ -38,7 +38,7 @@ public class AftersalesOrder extends BaseEntity
private String auditStatus; private String auditStatus;
/** 售后状态 */ /** 售后状态 */
@Excel(name = "售后状态") @Excel(name = "售后状态",dictType = "sales_aftersales_status")
private String aftersalesStatus; private String aftersalesStatus;
/** 业务员 */ /** 业务员 */

118
ruoyi-admin/src/main/java/com/ruoyi/aftersales/domain/vo/ExportAftersalesOrderVo.java

@ -0,0 +1,118 @@
package com.ruoyi.aftersales.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
import java.util.Date;
/**
* 导出售后单明细
* */
@Data
public class ExportAftersalesOrderVo {
/** 售后单号 */
@Excel(name = "售后单号")
private String aftersalesOrderCode;
/** 关联销售订单号 */
@Excel(name = "关联销售订单号")
private String salesOrderCode;
/** 售后状态 */
@Excel(name = "售后状态",dictType = "sales_aftersales_status")
private String aftersalesStatus;
/** 业务员 */
@Excel(name = "业务员")
private String businessName;
/** 售后员 */
@Excel(name = "售后员")
private String aftersalesName;
/** 客户ID */
@Excel(name = "客户ID")
private String customerId;
/** 客户名称 */
@Excel(name = "客户名称")
private String customerName;
/** 物料数合计 */
@Excel(name = "物料数合计")
private String materialSum;
/** 数量合计 */
@Excel(name = "数量合计")
private String enterpriseSum;
/** 客户要求出发日期 */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "客户要求出发日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date startDate;
/** 收货联系人 */
@Excel(name = "收货联系人")
private String deliveryName;
/** 收货电话 */
@Excel(name = "收货电话")
private String deliveryNumber;
/** 公司地址 */
@Excel(name = "公司地址")
private String companyAddress;
/** 料号 */
@Excel(name = "料号")
private String materialNo;
/** 物料名称 */
@Excel(name = "物料名称")
private String materialName;
/** 物料品牌 */
@Excel(name = "物料品牌")
private String materialBrand;
/** 物料单位 */
@Excel(name = "物料单位")
private String materialUnit;
/** 物料描述 */
@Excel(name = "物料描述")
private String materialDescribe;
/** 物料加工方式 */
@Excel(name = "物料加工方式",dictType = "processMethod")
private String materialProcessMethod;
/** 已出库数量 */
@Excel(name = "已出库数量")
private Integer shippedGoodsSum;
/** 紧急程度(0一般、1紧急) */
@Excel(name = "紧急程度",dictType = "aftersales_emergency_degree")
private String emergencyDegree;
/** 售后问题 */
@Excel(name = "售后问题")
private String aftersalesProblem;
/** SN号(产品序列号) */
@Excel(name = "SN号")
private String snCode;
/** 设备流水号 */
@Excel(name = "设备流水号")
private String deviceRunningNumber;
}

5
ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesOrderMapper.java

@ -89,4 +89,9 @@ public interface AftersalesOrderMapper
* 根据售后单号查询售后单详情数据 * 根据售后单号查询售后单详情数据
* */ * */
AftersalesOrder selectAftersalesOrderByCode(String aftersalesOrderCode); AftersalesOrder selectAftersalesOrderByCode(String aftersalesOrderCode);
/**
* 通过售后单号数组查询售后单详情数据
* */
List<AftersalesOrder> selectAftersalesOrderByCodes(String[] aftersalesOrderCodes);
} }

12
ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/IAftersalesOrderService.java

@ -2,6 +2,7 @@ package com.ruoyi.aftersales.service;
import java.util.List; import java.util.List;
import com.ruoyi.aftersales.domain.AftersalesOrder; import com.ruoyi.aftersales.domain.AftersalesOrder;
import com.ruoyi.aftersales.domain.vo.ExportAftersalesOrderVo;
import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO; import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO;
import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.runtime.ProcessInstance;
@ -98,4 +99,15 @@ public interface IAftersalesOrderService
* 根据售后单号查询售后单详情数据 * 根据售后单号查询售后单详情数据
* */ * */
AftersalesOrder selectAftersalesOrderByCode(String aftersalesNoticeCode); AftersalesOrder selectAftersalesOrderByCode(String aftersalesNoticeCode);
/**
* 通过售后单号数组查询售后单详情数据
* */
List<AftersalesOrder> selectAftersalesOrderByCodes(String[] aftersalesOrderCodes);
/**
* 导出售后单明细
* */
List<ExportAftersalesOrderVo> exportAftersalesOrderList(List<AftersalesOrder> list);
} }

78
ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/impl/AftersalesOrderServiceImpl.java

@ -1,7 +1,10 @@
package com.ruoyi.aftersales.service.impl; package com.ruoyi.aftersales.service.impl;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.ruoyi.aftersales.domain.vo.ExportAftersalesOrderVo;
import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
@ -12,6 +15,7 @@ import com.ruoyi.process.todoitem.mapper.BizTodoItemMapper;
import com.ruoyi.sales.domain.SalesAftersalesNotice; import com.ruoyi.sales.domain.SalesAftersalesNotice;
import com.ruoyi.sales.domain.SalesAftersalesNoticeDetail; import com.ruoyi.sales.domain.SalesAftersalesNoticeDetail;
import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO; import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO;
import com.ruoyi.sales.mapper.SalesAftersalesNoticeDetailMapper;
import com.ruoyi.sales.mapper.SalesAftersalesNoticeMapper; import com.ruoyi.sales.mapper.SalesAftersalesNoticeMapper;
import com.ruoyi.system.domain.SysAttach; import com.ruoyi.system.domain.SysAttach;
import com.ruoyi.system.domain.SysMakeOrder; import com.ruoyi.system.domain.SysMakeOrder;
@ -56,6 +60,9 @@ public class AftersalesOrderServiceImpl implements IAftersalesOrderService
@Autowired @Autowired
private SalesAftersalesNoticeMapper salesAftersalesNoticeMapper; private SalesAftersalesNoticeMapper salesAftersalesNoticeMapper;
@Autowired
private SalesAftersalesNoticeDetailMapper aftersalesNoticeDetailMapper;
/** /**
* 查询售后单 * 查询售后单
* *
@ -97,6 +104,16 @@ public class AftersalesOrderServiceImpl implements IAftersalesOrderService
return aftersalesOrderMapper.selectAftersalesOrderList(aftersalesOrder); return aftersalesOrderMapper.selectAftersalesOrderList(aftersalesOrder);
} }
/**
* 通过售后单号数组查询售后单详情数据
* */
@Override
public List<AftersalesOrder> selectAftersalesOrderByCodes(String[] aftersalesOrderCodes) {
return aftersalesOrderMapper.selectAftersalesOrderByCodes(aftersalesOrderCodes);
}
/** /**
* 新增售后单 * 新增售后单
* *
@ -324,4 +341,65 @@ public class AftersalesOrderServiceImpl implements IAftersalesOrderService
return aftersalesOrderMapper.selectAftersalesOrderWithAttachById(aftersalesOrder.getAftersalesOrderId()); return aftersalesOrderMapper.selectAftersalesOrderWithAttachById(aftersalesOrder.getAftersalesOrderId());
} }
/**
* 导出售后单明细
* */
@Override
public List<ExportAftersalesOrderVo> exportAftersalesOrderList(List<AftersalesOrder> list) {
// 获取所有的售后单号
List<String> collectAftersalesOrderCodes = list.stream()
.map(AftersalesOrder::getAftersalesOrderCode)
.collect(Collectors.toList());
// 根据售后单号查询对应的物料详情列表
List<SalesAftersalesNoticeDetail> salesAftersalesNoticeDetails = aftersalesNoticeDetailMapper.selectAftersalesNoticeDetailListByCodes(collectAftersalesOrderCodes);
// 创建一个 AftersalesOrder 的 Map,键为售后单号
Map<String, AftersalesOrder> aftersalesOrderMap = list.stream()
.collect(Collectors.toMap(AftersalesOrder::getAftersalesOrderCode, Function.identity(), (existing, replacement) -> existing));
// 初始化导出列表
List<ExportAftersalesOrderVo> exportAftersalesOrderVos = new ArrayList<>();
for (SalesAftersalesNoticeDetail detail : salesAftersalesNoticeDetails) {
ExportAftersalesOrderVo exportVo = new ExportAftersalesOrderVo();
// 从 SalesAftersalesNoticeDetail 填充数据
exportVo.setMaterialNo(detail.getMaterialNo());
exportVo.setMaterialName(detail.getMaterialName());
exportVo.setMaterialBrand(detail.getMaterialBrand());
exportVo.setMaterialUnit(detail.getMaterialUnit());
exportVo.setMaterialDescribe(detail.getMaterialDescribe());
exportVo.setMaterialProcessMethod(detail.getMaterialProcessMethod());
exportVo.setShippedGoodsSum(detail.getShippedGoodsSum());
exportVo.setEmergencyDegree(detail.getEmergencyDegree());
exportVo.setAftersalesProblem(detail.getAftersalesProblem());
exportVo.setSnCode(detail.getSnCode());
exportVo.setDeviceRunningNumber(detail.getDeviceRunningNumber());
// 从 AftersalesOrder 填充数据,通过售后单号进行关联
AftersalesOrder order = aftersalesOrderMap.get(detail.getAftersalesNoticeCode());
if (order != null) {
exportVo.setAftersalesOrderCode(order.getAftersalesOrderCode());
exportVo.setSalesOrderCode(order.getSalesOrderCode());
exportVo.setAftersalesStatus(order.getAftersalesStatus());
exportVo.setBusinessName(order.getBusinessName());
exportVo.setAftersalesName(order.getAftersalesName());
exportVo.setCustomerId(order.getCustomerId());
exportVo.setCustomerName(order.getCustomerName());
exportVo.setMaterialSum(order.getMaterialSum());
exportVo.setEnterpriseSum(order.getEnterpriseSum());
exportVo.setStartDate(order.getStartDate());
exportVo.setDeliveryName(order.getDeliveryName());
exportVo.setDeliveryNumber(order.getDeliveryNumber());
exportVo.setCompanyAddress(order.getCompanyAddress());
}
// 添加到结果列表
exportAftersalesOrderVos.add(exportVo);
}
return exportAftersalesOrderVos;
}
} }

1
ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesAftersalesNoticeDetailMapper.java

@ -85,4 +85,5 @@ public interface SalesAftersalesNoticeDetailMapper
* */ * */
List<SalesAftersalesNoticeDetail> selectAftersalesNoticeDetailListByCodes(List<String> collectNoticeCodes); List<SalesAftersalesNoticeDetail> selectAftersalesNoticeDetailListByCodes(List<String> collectNoticeCodes);
} }

8
ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesOrderMapper.xml

@ -115,6 +115,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where aftersales_order_code = #{aftersalesOrderCode} where aftersales_order_code = #{aftersalesOrderCode}
</select> </select>
<select id="selectAftersalesOrderByCodes" parameterType="String" resultMap="AftersalesOrderResult">
<include refid="selectAftersalesOrderVo"/>
where aftersales_order_code in
<foreach collection="array" item="aftersalesOrderCode" open="(" separator="," close=")">
#{aftersalesOrderCode}
</foreach>
</select>
<insert id="insertAftersalesOrder" parameterType="AftersalesOrder" useGeneratedKeys="true" keyProperty="aftersalesOrderId"> <insert id="insertAftersalesOrder" parameterType="AftersalesOrder" useGeneratedKeys="true" keyProperty="aftersalesOrderId">
insert into aftersales_order insert into aftersales_order
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">

31
ruoyi-admin/src/main/resources/templates/aftersales/aftersalesOrder/aftersalesOrder.html

@ -47,6 +47,13 @@
</div> </div>
</form> </form>
</div> </div>
<div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-success" onclick="exportExcel()" shiro:hasPermission="aftersales:aftersalesOrder:export">
<i class="fa fa-download"></i> 导出
</a>
</div>
<div class="col-sm-12 select-table table-striped"> <div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table> <table id="bootstrap-table"></table>
</div> </div>
@ -240,6 +247,30 @@
// } // }
// } // }
// 导出
function exportExcel() {
var ids = $.table.selectColumns("aftersalesOrderCode");
var dataParam = $("#formId").serializeArray();
let tipMsg = "确定导出当前所有数据吗?";
if ($.common.isNotEmpty(ids)) {
tipMsg = `确定导出 ${ids} 数据吗?`;
dataParam.push({ "name": "ids", "value": ids });
}
$.modal.confirm(tipMsg, function () {
$.modal.loading("正在导出数据,请稍后...");
$.post( prefix + "/export", dataParam, function (result) {
if (result.code === web_status.SUCCESS) {
window.location.href = ctx + "common/download?fileName="+ encodeURI(result.msg) + "&delete=" + true;
} else {
$.modal.alertError(result.msg);
}
$.modal.closeLoading();
});
});
}
</script> </script>
</body> </body>
</html> </html>
Loading…
Cancel
Save