Browse Source

[feat] 销售管理

按照万材要求,销售管理售后通知单新增导出功能,支持部分行和全部行导出,导出更多数据
新增 销售管理售后通知单导出明细实体类
新增导出所有和选择导出后端接口
新增 导出售后通知单明细方法
新增 根据售后通知单号集合查询售后通知单集合方法
新增 根据售后通知单号查询售后通知单详情数据方法
dev
liuxiaoxu 6 days ago
parent
commit
caa972cd24
  1. 27
      ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesAftersalesNoticeController.java
  2. 133
      ruoyi-admin/src/main/java/com/ruoyi/sales/domain/VO/ExportSalesAftersalesNoticeVo.java
  3. 6
      ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesAftersalesNoticeDetailMapper.java
  4. 4
      ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesAftersalesNoticeMapper.java
  5. 12
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesAftersalesNoticeService.java
  6. 80
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeServiceImpl.java
  7. 7
      ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeDetailMapper.xml
  8. 8
      ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeMapper.xml
  9. 62
      ruoyi-admin/src/main/resources/templates/sales/afterSalesNotice/afterSalesNotice.html

27
ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesAftersalesNoticeController.java

@ -8,6 +8,7 @@ import com.ruoyi.aftersales.service.IAftersalesOrderService;
import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.quality.domain.VO.CheckoutMaterialVO;
import com.ruoyi.sales.domain.SalesAftersalesNoticeDetail;
import com.ruoyi.sales.domain.VO.ExportSalesAftersalesNoticeVo;
import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO;
import com.ruoyi.sales.service.ISalesAftersalesNoticeDetailService;
import com.ruoyi.system.domain.SysSalesOrder;
@ -95,15 +96,33 @@ public class SalesAftersalesNoticeController extends BaseController
*/
@RequiresPermissions("sales:afterSalesNotice:export")
@Log(title = "售后通知单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
@PostMapping("/exportAll")
@ResponseBody
public AjaxResult export(SalesAftersalesNoticeVO salesAftersalesNoticeVO)
public AjaxResult exportAll(SalesAftersalesNoticeVO salesAftersalesNoticeVO)
{
List<SalesAftersalesNoticeVO> list = salesAftersalesNoticeService.selectSalesAftersalesNoticeList(salesAftersalesNoticeVO);
ExcelUtil<SalesAftersalesNoticeVO> util = new ExcelUtil<SalesAftersalesNoticeVO>(SalesAftersalesNoticeVO.class);
return util.exportExcel(list, "售后通知单数据");
List<ExportSalesAftersalesNoticeVo> exportSalesAftersalesNoticeVos = salesAftersalesNoticeService.exportSalesAftersalesNoticeList(list);
ExcelUtil<ExportSalesAftersalesNoticeVo> util = new ExcelUtil<ExportSalesAftersalesNoticeVo>(ExportSalesAftersalesNoticeVo.class);
return util.exportExcel(exportSalesAftersalesNoticeVos, "售后通知单数据");
}
/**
* 导出售后通知单列表
*/
@RequiresPermissions("sales:afterSalesNotice:export")
@Log(title = "售后通知单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
@ResponseBody
public AjaxResult export(@RequestBody String[] aftersalesNoticeCodes)
{
List<SalesAftersalesNoticeVO> list = salesAftersalesNoticeService.selectSalesAftersalesNoticeListByCodes(aftersalesNoticeCodes);
List<ExportSalesAftersalesNoticeVo> exportSalesAftersalesNoticeVos = salesAftersalesNoticeService.exportSalesAftersalesNoticeList(list);
ExcelUtil<ExportSalesAftersalesNoticeVo> util = new ExcelUtil<ExportSalesAftersalesNoticeVo>(ExportSalesAftersalesNoticeVo.class);
return util.exportExcel(exportSalesAftersalesNoticeVos, "售后通知单数据");
}
/**
* 新增售后通知单
*/

133
ruoyi-admin/src/main/java/com/ruoyi/sales/domain/VO/ExportSalesAftersalesNoticeVo.java

@ -0,0 +1,133 @@
package com.ruoyi.sales.domain.VO;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
import java.util.Date;
/**
* 销售管理售后通知单导出明细
* */
@Data
public class ExportSalesAftersalesNoticeVo {
/** 售后单号 */
@Excel(name = "售后单号")
private String aftersalesNoticeCode;
/** 关联销售订单编号 */
@Excel(name = "关联销售订单编号")
private String salesOrderCode;
/** 关联生产订单号 */
@Excel(name = "关联生产订单号")
private String makeNo;
/** 审核状态 */
@Excel(name = "审核状态", dictType = "auditStatus")
private String auditStatus;
/** 售后状态 */
@Excel(name = "售后状态",dictType = "sales_aftersales_status")
private String aftersalesStatus;
/** 业务人员 */
@Excel(name = "业务人员")
private String businessMembers;
/** 售后人员 */
@Excel(name = "售后人员")
private String aftersalesMembers;
/** 客户代码 */
@Excel(name = "客户代码")
private String enterpriseCode;
/** 客户名称 */
@Excel(name = "客户名称")
private String enterpriseName;
/** 物料数合计 */
@Excel(name = "物料数合计")
private String materialSum;
/** 数量合计 */
@Excel(name = "数量合计")
private String enterpriseSum;
/** 客户要求出发日期 */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "客户要求出发日期")
private Date startTime;
/** 联系人 */
@Excel(name = "联系人")
private String customerContact;
/** 联系电话 */
@Excel(name = "联系电话")
private String contactNumber;
/** 公司地址 */
@Excel(name = "公司地址")
private String companyAddress;
/** 紧急程度(0一般、1紧急) */
@Excel(name = "紧急程度", dictType = "aftersales_emergency_degree")
private String emergencyDegree;
/** 售后问题 */
@Excel(name = "售后问题")
private String aftersalesProblem;
/** 报告问题 */
@Excel(name = "报告问题")
private String aftersalesReportUrl;
/** 客户ID */
private String customerId;
/** 客户名称 */
private String customerName;
/** SN号(产品序列号) */
@Excel(name = "SN号")
private String snCode;
/** 设备流水号 */
@Excel(name = "设备流水号")
private String deviceRunningNumber;
/** 物料名称 */
@Excel(name = "物料名称")
private String materialName;
/** 料号 */
@Excel(name = "料号")
private String materialNo;
/** 物料品牌 */
@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;
}

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

@ -79,4 +79,10 @@ public interface SalesAftersalesNoticeDetailMapper
* 根据售后通知单号查询售后通知单详情数据
* */
List<SalesAftersalesNoticeDetail> selectSalesAftersalesNoticeDetailListByCode(String aftersalesNoticeCode);
/**
* 根据售后通知单号查询售后通知单详情数据
* */
List<SalesAftersalesNoticeDetail> selectAftersalesNoticeDetailListByCodes(List<String> collectNoticeCodes);
}

4
ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesAftersalesNoticeMapper.java

@ -86,4 +86,8 @@ public interface SalesAftersalesNoticeMapper
* */
int updateSalesAftersalesNoticeByCode(SalesAftersalesNotice salesAftersalesNotice);
/**
* 根据售后通知单号集合查询售后通知单集合
* */
List<SalesAftersalesNoticeVO> selectSalesAftersalesNoticeListByCodes(String[] aftersalesNoticeCodes);
}

12
ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesAftersalesNoticeService.java

@ -4,6 +4,7 @@ import java.util.List;
import com.ruoyi.aftersales.domain.AftersalesOrder;
import com.ruoyi.sales.domain.SalesAftersalesNotice;
import com.ruoyi.sales.domain.VO.ExportSalesAftersalesNoticeVo;
import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO;
import com.ruoyi.system.domain.SysSalesOrder;
import com.ruoyi.system.domain.Vo.SelectAftersalesNoticeVO;
@ -95,4 +96,15 @@ public interface ISalesAftersalesNoticeService
* 根据销售单号查询售后通知单Vo类
* */
List<SelectAftersalesNoticeVO> selectMaterialInfoBySalesOrderCode(String salesOrderCode);
/**
* 导出售后通知单明细
* */
List<ExportSalesAftersalesNoticeVo> exportSalesAftersalesNoticeList(List<SalesAftersalesNoticeVO> list);
/**
* 根据售后通知单号集合查询售后通知单集合
* */
List<SalesAftersalesNoticeVO> selectSalesAftersalesNoticeListByCodes(String[] aftersalesNoticeCodes);
}

80
ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeServiceImpl.java

@ -1,6 +1,8 @@
package com.ruoyi.sales.service.impl;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.github.pagehelper.Page;
import com.ruoyi.common.core.domain.entity.SysUser;
@ -13,11 +15,11 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.process.todoitem.mapper.BizTodoItemMapper;
import com.ruoyi.sales.domain.SalesAftersalesNoticeDetail;
import com.ruoyi.sales.domain.VO.ExportSalesAftersalesNoticeVo;
import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO;
import com.ruoyi.sales.mapper.SalesAftersalesNoticeDetailMapper;
import com.ruoyi.system.domain.SysMakeOrder;
import com.ruoyi.system.domain.SysSalesOrder;
import com.ruoyi.system.domain.SysSalesOrderChild;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.Vo.ExportSalesShippingInformDetailVo;
import com.ruoyi.system.domain.Vo.SelectAftersalesNoticeVO;
import com.ruoyi.system.mapper.SysMakeOrderMapper;
import com.ruoyi.system.mapper.SysSalesOrderChildMapper;
@ -90,6 +92,16 @@ public class SalesAftersalesNoticeServiceImpl implements ISalesAftersalesNoticeS
return salesAftersalesNoticeMapper.selectSalesAftersalesNoticeById(aftersalesNoticeId);
}
/**
* 根据售后通知单号集合查询售后通知单集合
* */
@Override
public List<SalesAftersalesNoticeVO> selectSalesAftersalesNoticeListByCodes(String[] aftersalesNoticeCodes) {
List<SalesAftersalesNoticeVO> list = salesAftersalesNoticeMapper.selectSalesAftersalesNoticeListByCodes(aftersalesNoticeCodes);
return list;
}
/**
* 查询售后通知单列表
*
@ -339,6 +351,68 @@ public class SalesAftersalesNoticeServiceImpl implements ISalesAftersalesNoticeS
}
/**
* 导出售后单明细
* */
@Override
public List<ExportSalesAftersalesNoticeVo> exportSalesAftersalesNoticeList(List<SalesAftersalesNoticeVO> list) {
// 获取所有的售后单号
List<String> collectNoticeCodes = list.stream().map(SalesAftersalesNoticeVO::getAftersalesNoticeCode).collect(Collectors.toList());
// 根据售后单号查询对应的详情列表
List<SalesAftersalesNoticeDetail> aftersalesNoticeDetails = aftersalesNoticeDetailMapper.selectAftersalesNoticeDetailListByCodes(collectNoticeCodes);
// 创建一个售后通知VO的Map,键为售后单号
Map<String, SalesAftersalesNoticeVO> salesAftersalesNoticeVOMap = list.stream()
.collect(Collectors.toMap(SalesAftersalesNoticeVO::getAftersalesNoticeCode, Function.identity()));
// 初始化导出列表
List<ExportSalesAftersalesNoticeVo> exportSalesAftersalesNoticeVos = new ArrayList<>();
for (SalesAftersalesNoticeDetail detail : aftersalesNoticeDetails) {
ExportSalesAftersalesNoticeVo exportVo = new ExportSalesAftersalesNoticeVo();
// 从SalesAftersalesNoticeDetail填充数据
exportVo.setEmergencyDegree(detail.getEmergencyDegree());
exportVo.setAftersalesProblem(detail.getAftersalesProblem());
exportVo.setAftersalesReportUrl(detail.getAftersalesReportUrl());
exportVo.setSnCode(detail.getSnCode());
exportVo.setDeviceRunningNumber(detail.getDeviceRunningNumber());
exportVo.setMaterialName(detail.getMaterialName());
exportVo.setMaterialNo(detail.getMaterialNo());
exportVo.setMaterialBrand(detail.getMaterialBrand());
exportVo.setMaterialUnit(detail.getMaterialUnit());
exportVo.setMaterialDescribe(detail.getMaterialDescribe());
exportVo.setMaterialProcessMethod(detail.getMaterialProcessMethod());
exportVo.setShippedGoodsSum(detail.getShippedGoodsSum());
// 从SalesAftersalesNoticeVO填充数据,通过售后单号进行关联
SalesAftersalesNoticeVO noticeVO = salesAftersalesNoticeVOMap.get(detail.getAftersalesNoticeCode());
if (noticeVO != null) {
exportVo.setAftersalesNoticeCode(noticeVO.getAftersalesNoticeCode());
exportVo.setSalesOrderCode(noticeVO.getSalesOrderCode());
exportVo.setMakeNo(noticeVO.getMakeNo());
exportVo.setAuditStatus(noticeVO.getAuditStatus());
exportVo.setAftersalesStatus(noticeVO.getAftersalesStatus());
exportVo.setBusinessMembers(noticeVO.getBusinessMembers());
exportVo.setAftersalesMembers(noticeVO.getAftersalesMembers());
exportVo.setEnterpriseCode(noticeVO.getEnterpriseCode());
exportVo.setEnterpriseName(noticeVO.getEnterpriseName());
exportVo.setMaterialSum(noticeVO.getMaterialSum());
exportVo.setEnterpriseSum(noticeVO.getEnterpriseSum());
exportVo.setStartTime(noticeVO.getStartTime());
exportVo.setCustomerContact(noticeVO.getCustomerContact());
exportVo.setContactNumber(noticeVO.getContactNumber());
exportVo.setCompanyAddress(noticeVO.getCompanyAddress());
}
// 添加到结果列表
exportSalesAftersalesNoticeVos.add(exportVo);
}
return exportSalesAftersalesNoticeVos;
}
/**
* 创建售后单审核流程
* @param applyTitle

7
ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeDetailMapper.xml

@ -53,6 +53,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where aftersales_notice_code = #{aftersalesNoticeCode}
</select>
<select id="selectAftersalesNoticeDetailListByCodes" parameterType="String" resultMap="SalesAftersalesNoticeDetailResult">
<include refid="selectSalesAftersalesNoticeDetailVo"/>
where aftersales_notice_code in
<foreach item="aftersalesNoticeCode" collection="list" open="(" separator="," close=")">
#{aftersalesNoticeCode}
</foreach>
</select>
<insert id="insertSalesAftersalesNoticeDetail" parameterType="SalesAftersalesNoticeDetail" useGeneratedKeys="true" keyProperty="aftersalesNoticeDetailId">

8
ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeMapper.xml

@ -69,6 +69,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where aftersales_notice_code = #{aftersalesNoticeCode}
</select>
<select id="selectSalesAftersalesNoticeListByCodes" parameterType="String" resultMap="SalesAftersalesNoticeResult">
<include refid="selectSalesAftersalesNoticeVo"/>
where aftersales_notice_code in
<foreach item="aftersalesNoticeCode" collection="array" open="(" separator="," close=")">
#{aftersalesNoticeCode}
</foreach>
</select>
<insert id="insertSalesAftersalesNotice" parameterType="SalesAftersalesNoticeVO" useGeneratedKeys="true" keyProperty="aftersalesNoticeId">
insert into sales_aftersales_notice

62
ruoyi-admin/src/main/resources/templates/sales/afterSalesNotice/afterSalesNotice.html

@ -55,8 +55,13 @@
</form>
</div>
<div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-success" onclick="exportExcel()" shiro:hasPermission="sales:afterSalesNotice:export">
<i class="fa fa-download"></i> 导出
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table" style="white-space:nowrap"></table>
<table id="bootstrap-table"></table>
</div>
</div>
</div>
@ -289,6 +294,61 @@
$.modal.open("详情",url);
}
// 导出
function exportExcel(formId) {
// $.table.set();
var aftersalesNoticeCodeData = [];
var selections = $("#bootstrap-table").bootstrapTable("getSelections");
if(selections.length === 0){
$.modal.confirm("确定导出所有售后通知单吗?", function() {
var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
var params = $("#bootstrap-table").bootstrapTable('getOptions');
var dataParam = $("#" + currentId).serializeArray();
dataParam.push({ "name": "orderByColumn", "value": params.sortName });
dataParam.push({ "name": "isAsc", "value": params.sortOrder });
$.modal.loading("正在导出数据,请稍后...");
$.post(prefix + '/exportAll', dataParam, function(result) {
if (result.code == web_status.SUCCESS) {
window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true;
} else if (result.code == web_status.WARNING) {
$.modal.alertWarning(result.msg)
} else {
$.modal.alertError(result.msg);
}
$.modal.closeLoading();
});
});
}else {
$.modal.confirm("确定导出选中的所有售后通知单吗?", function () {
//·拼接单号
for(let i=0;i<selections.length;i++){
aftersalesNoticeCodeData.push(selections[i].aftersalesNoticeCode);
}
var aftersalesNoticeCodes = JSON.stringify(aftersalesNoticeCodeData);
// console.log(bomNos);
$.modal.loading("正在导出数据,请稍后...");
var config = {
url: prefix + '/export',
type: "post",
dataType: "json",
contentType: "application/json;charset=utf-8",
data: aftersalesNoticeCodes,
success: function(result) {
window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true;
$.modal.alertSuccess("导出成功!")
$.modal.closeLoading();
},
error: function (result){
$.modal.alertError(result.msg);
}
};
$.ajax(config)
});
}
};
</script>
</body>
</html>
Loading…
Cancel
Save